ID   FirstName   LastName
1      John        Doe
2      Bugs        Bunny
3      John        Johnson

我想从FirstName列中选择DISTINCT结果,但我需要相应的ID和LastName。

结果集只需要显示一个John,但是ID为1,LastName为Doe。


当前回答

SELECT DISTINCT (column1), column2
FROM table1
GROUP BY column1

其他回答

DISTINCT关键字并没有按照您期望的方式工作。当你使用SELECT DISTINCT col1, col2, col3时,你实际上选择了所有唯一的{col1, col2, col3}元组。

试试这个查询

 SELECT ID, FirstName, LastName FROM table GROUP BY(FirstName)

不确定是否可以用MySQL做到这一点,但你可以在T-SQL中使用CTE

; WITH tmpPeople AS (
 SELECT 
   DISTINCT(FirstName),
   MIN(Id)      
 FROM People
)
SELECT
 tP.Id,
 tP.FirstName,
 P.LastName
FROM tmpPeople tP
JOIN People P ON tP.Id = P.Id

否则,您可能不得不使用临时表。

SELECT DISTINCT (column1), column2
FROM table1
GROUP BY column1

正如fyrye所指出的,被接受的答案与MySQL的旧版本有关,其中只有_full_group_by还没有被引入。使用MySQL 8.0.17(在本例中使用),除非禁用ONLY_FULL_GROUP_BY,否则将得到以下错误消息:

mysql> SELECT id, firstName, lastName FROM table_name GROUP BY firstName;

错误1055 (42000):SELECT列表中的表达式#1不在GROUP BY子句中,并且包含未聚合的列mydatabase.table_name。id',它不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by不兼容

fyrye没有提到,但在https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html中描述的一种方法是将ANY_VALUE()函数应用到不在GROUP by子句中的列(本例中的id和lastName):

mysql> SELECT ANY_VALUE(id) as id, firstName, ANY_VALUE(lastName) as lastName FROM table_name GROUP BY firstName;
+----+-----------+----------+
| id | firstName | lastName |
+----+-----------+----------+
|  1 | John      | Doe      |
|  2 | Bugs      | Bunny    |
+----+-----------+----------+
2 rows in set (0.01 sec)

如上所述,

在这种情况下,MySQL忽略每个名称组中地址值的不确定性并接受查询。如果您不关心为每个组选择非聚合列的哪个值,那么这可能很有用。与SUM()或COUNT()等函数不同,ANY_VALUE()不是一个聚合函数。它只是抑制了不确定性的测试。