ID FirstName LastName
1 John Doe
2 Bugs Bunny
3 John Johnson
我想選擇從FirstName
列DISTINCT
結果,但我需要相應的ID
和LastName
。MySQL的選擇一列DISTINCT,與相應的其他列
結果集只需顯示一個John
,但其中ID
是1和LastName
。
ID FirstName LastName
1 John Doe
2 Bugs Bunny
3 John Johnson
我想選擇從FirstName
列DISTINCT
結果,但我需要相應的ID
和LastName
。MySQL的選擇一列DISTINCT,與相應的其他列
結果集只需顯示一個John
,但其中ID
是1和LastName
。
嘗試此查詢
SELECT ID, FirstName, LastName FROM table GROUP BY(FirstName)
這不適用於MySQL 5.5 – NullVoxPopuli 2011-10-13 19:23:33
我們如何知道哪一行將被返回? – 2013-05-05 16:51:37
@根據MySQL [文檔](http://dev.mysql.com/doc/refman/5.1/en/group-by-extensions.html),你不可以:「服務器可以自由選擇來自每個組的任何值,所以除非它們相同,否則選擇的值是不確定的。「 實際上,我已經成功地將這種查詢與ORDER BY子句一起使用,例如,您可以添加ORDER BY id ASC/DESC,並且每次執行查詢時MySQL都會返回一致的結果。但我會確定是否有人在生產環境中使用未公開的功能。 – 2013-06-03 14:54:43
DISTINCT
關鍵字並不像您期待的那樣真正起作用。當你使用SELECT DISTINCT col1, col2, col3
時,你實際上選擇了所有獨特的{col1,col2,col3}元組。
感謝Brian的指出。你能提供一個我如何利用GROUP BY獲得相同結果的例子嗎? – 2011-05-11 16:20:30
不知道你是否能與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 ID,LastName
From TABLE_NAME
GROUP BY FirstName
HAVING COUNT(*) >=1
加入'HAVING'讓我的查詢慢了50%。 – 2015-10-21 22:08:09
有沒有HAVING COUNT(*)> = 1的情況是錯誤的? – 2016-12-03 17:52:26
SELECT DISTINCT(firstName), ID, LastName from tableName GROUP BY firstName
將是最好的選擇海事組織。
這將不起作用,它也將ID和姓氏納入獨特的評估。 – 2014-06-30 15:05:10
SELECT firstName, ID, LastName from tableName GROUP BY firstName
您可以使用group by來顯示不同的值以及相應的字段。
select * from tabel_name group by FirstName
現在,你有這樣的輸出:
ID FirstName LastName
2 Bugs Bunny
1 John Doe
如果你想回答這樣
ID FirstName LastName
1 John Doe
2 Bugs Bunny
然後使用此查詢,
select * from table_name group by FirstName order by ID
按訂單進行分組時,這並不總是會產生預期結果 – fyrye 2014-09-30 15:35:31
編輯
原來的答案之前的MySQL 5.7.5,到原來的答案不再適用寫入。需要注意的是,使用GROUP BY
而沒有聚合函數將會產生意想不到的結果,因爲MySQL可以自由選擇被分組的數據集中的任何值。
假設名字和姓氏是唯一索引的,GROUP BY
的替代方法是使用LEFT JOIN
來篩選結果集。See Demonstration
要檢索截然不同的姓名由姓氏有序降序(ZA)
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname < t2.lastname
WHERE t2.id IS NULL;
#Results
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
要檢索截然不同的姓名由姓氏以升序(AZ)
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname > t2.lastname
WHERE t2.id IS NULL;
#Results
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |
有序
您可以根據需要訂購產生的數據。 Test Case Example:
警告
隨着MySQL的GROUP BY
與ORDER BY
見使用時不會總是產生預期的效果。
確保預期結果的最佳實現方法是使用像這樣的子查詢來過濾結果集範圍。
表名數據
ID FirstName LastName
1 John Doe
2 Bugs Bunny
3 John Johnson
查詢
SELECT * FROM (
SELECT * FROM table_name ORDER BY ID DESC
) AS t1
GROUP BY FirstName
#Results
ID FirstName LastName
2 Bugs Bunny
3 John Johnson
對戰
SELECT * FROM table_name GROUP BY FirstName ORDER BY ID DESC
#Results
ID FirstName LastName
2 Bugs Bunny
1 John Doe
迄今爲止答案最全。在第一個查詢中將'ID desc'更改爲'ID asc'可以讓我們檢索'John Doe'或'John Johnson'。在第二個查詢中更改'ID desc'不會產生這種效果。 – carla 2015-06-19 15:44:29
在postgres上,您不需要確定mysql就需要在組中使用ID。 – 2015-08-20 14:04:55
請記住,當使用該組和按順序時,MySQL是唯一的數據庫,允許在組中使用列和/或按順序使用不屬於select語句的部分。
因此,例如: 選擇COLUMN1 從表 組由COLUMN2 ORDER BY欄3
這不會在其他數據庫一樣Postgres的,甲骨文,MSSQL,等飛你就必須做好以下這些數據庫
選擇列1,列2,列2通過 欄3從表 組 ORDER BY欄3
只是索姆如果您將當前代碼遷移到另一個數據庫或者開始在另一個數據庫中工作並嘗試重新使用代碼,則需要提供信息。
你想要姓氏屬於最低的ID與不同的名字? – 2011-05-11 15:57:07
使用'GROUP BY'而不是 – diEcho 2011-05-11 15:57:12
應該選擇頂級的邏輯是什麼?我想你會希望John Doe和John Johnson都出現,因爲他們是兩個不同的約翰,但那只是我。 – judda 2011-05-11 16:00:23