2011-05-11 57 views
137
ID FirstName LastName 
1  John  Doe 
2  Bugs  Bunny 
3  John  Johnson 

我想選擇從FirstNameDISTINCT結果,但我需要相應的IDLastNameMySQL的選擇一列DISTINCT,與相應的其他列

結果集只需顯示一個John,但其中ID是1和LastName

+1

你想要姓氏屬於最低的ID與不同的名字? – 2011-05-11 15:57:07

+4

使用'GROUP BY'而不是 – diEcho 2011-05-11 15:57:12

+1

應該選擇頂級的邏輯是什麼?我想你會希望John Doe和John Johnson都出現,因爲他們是兩個不同的約翰,但那只是我。 – judda 2011-05-11 16:00:23

回答

137

嘗試此查詢

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

這不適用於MySQL 5.5 – NullVoxPopuli 2011-10-13 19:23:33

+10

我們如何知道哪一行將被返回? – 2013-05-05 16:51:37

+18

@根據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

44

DISTINCT關鍵字並不像您期待的那樣真正起作用。當你使用SELECT DISTINCT col1, col2, col3時,你實際上選擇了所有獨特的{col1,col2,col3}元組。

+4

感謝Brian的指出。你能提供一個我如何利用GROUP BY獲得相同結果的例子嗎? – 2011-05-11 16:20:30

2

不知道你是否能與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 

否則,你可能必須使用一個臨時表。

20
SELECT ID,LastName 
From TABLE_NAME 
GROUP BY FirstName 
HAVING COUNT(*) >=1 
+2

加入'HAVING'讓我的查詢慢了50%。 – 2015-10-21 22:08:09

+0

有沒有HAVING COUNT(*)> = 1的情況是錯誤的? – 2016-12-03 17:52:26

0
SELECT DISTINCT(firstName), ID, LastName from tableName GROUP BY firstName 

將是最好的選擇海事組織。

+27

這將不起作用,它也將ID和姓氏納入獨特的評估。 – 2014-06-30 15:05:10

2
SELECT firstName, ID, LastName from tableName GROUP BY firstName 
-2

您可以使用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 
+2

按訂單進行分組時,這並不總是會產生預期結果 – fyrye 2014-09-30 15:35:31

38

編輯

原來的答案之前的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 BYORDER 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 
+2

迄今爲止答案最全。在第一個查詢中將'ID desc'更改爲'ID asc'可以讓我們檢索'John Doe'或'John Johnson'。在第二個查詢中更改'ID desc'不會產生這種效果。 – carla 2015-06-19 15:44:29

+0

在postgres上,您不需要確定mysql就需要在組中使用ID。 – 2015-08-20 14:04:55

0
select distinct (column1), column2 
from table1 
group by column1 
+1

'DISTINCT()'不是一個函數。另外DISTINCT和GROUP BY也在做同樣的事情,所以沒有理由把它們都放在一起。 – Marki555 2015-07-15 07:37:45

+0

這不是一個有效的聲明,您應該使用DISTINCT或Group By而不是兩者。 – heshanlk 2017-08-18 03:33:49

0

請記住,當使用該組和按順序時,MySQL是唯一的數據庫,允許在組中使用列和/或按順序使用不屬於select語句的部分。

因此,例如: 選擇COLUMN1 從表 組由COLUMN2 ORDER BY欄3

這不會在其他數據庫一樣Postgres的,甲骨文,MSSQL,等飛你就必須做好以下這些數據庫

選擇列1,列2,列2通過 欄3從表 組 ORDER BY欄3

只是索姆如果您將當前代碼遷移到另一個數據庫或者開始在另一個數據庫中工作並嘗試重新使用代碼,則需要提供信息。