2013-02-21 107 views
2

如何才能返回MySQL中第一個不同的字段匹配?如何僅從MySQL中的字段中選擇唯一的第一個匹配項?

我的表:

name  hash 
---------------- 
Anna  ABC 
Barb  DEF 
Charlie GHI 
Anna  JKL 
Andrea MNO 

我查詢(%An%):

SELECT DISTINCT(name) as name, hash FROM my_table WHERE name LIKE '%An%'; 

這將返回:

name  hash 
---------------- 
Anna  ABC 
Anna  JKL 
Andrea MNO 

相反的:(結果我之後)

name  hash 
---------------- 
Anna  ABC 
Andrea MNO 

我怎樣才能得到每個不同名稱的第一個匹配?

我想回到第一Anna,跳過第二個(及任何後續的比賽),但仍獲得Andrea(和任何進一步的不同的比賽,像AndrewAnthony)。

回答

8

DISTINCT不以這種方式工作,值必須在返回的所有列中不同。

您可以隨時使用的hash功能和GROUP BY name這將返回一個值hash每個name聚合函數:

SELECT name, min(hash) hash 
FROM my_table 
WHERE name LIKE '%An%' 
GROUP BY name; 

SQL Fiddle with Demo

注意:GROUP BY一起使用聚合函數將確保您將始終返回hash列的預期值。當您不要GROUP BY或聚合SELECT列表中的項目時,您可能會返回意外的結果。 (見MySQL Extensions to GROUP BY

從MySQL的文檔:

MySQL的擴展使用GROUP BY的,這樣的選擇列表可參考在GROUP BY子句中未命名的非聚合列。 ...您可以使用此功能通過避免不必要的列排序和分組來獲得更好的性能。但是,這非常有用,因爲每個未在GROUP BY中命名的非聚合列中的所有值對於每個組都是相同的。服務器可以自由選擇每個組中的任何值,因此除非它們相同,否則所選值是不確定的。此外,每個組的值的選擇不能通過添加ORDER BY子句來影響。結果集的排序在選擇值後發生,而ORDER BY不影響服務器選擇的值。

1
SELECT 
    name, hash 
FROM 
    my_table 
WHERE 
    name LIKE '%An%' 
GROUP BY 
    name; 
+0

對不起,這是一個錯字。我正在編輯它。 – Slowcoder 2013-02-21 19:44:09

+0

就這麼簡單吧?因爲我使用'distinct',所以我認爲'group by'是多餘的。 – Ryan 2013-02-21 19:44:19

+0

是的。當行中的所有列值都匹配時,'distinct'將會很有用。在這種情況下,可以刪除DISTINCT。 – Slowcoder 2013-02-21 19:46:52

0

DISTINCT提供了獨特的數據行。在你的例子中散列是不同的,因此你爲什麼沒有得到你想要的結果。

問題:什麼是散列用於?你需要它獨特的,還是不需要?

如果您不需要它,請將其從SELECT子句中刪除,並且您將擁有唯一的名稱。

如果你需要它,但它不需要是唯一的,你可以添加一個GROUP BY子句,即GROUP BY name,它將按名稱(只給你唯一的名字)分組你的結果。請注意,使用GROUP BY表示當名稱爲'Anna'時,散列值可以是'ABC'或'JKL'。

+0

當你說「散列的值可能是ABC或JKL」時,是不是總是表中的第一個?什麼情況(除了排序),會導致這是隨機的? – Ryan 2013-02-21 19:53:47

+0

@Ryan沒有保證,如果你不聚集'哈希'列的值將是什麼。這就是爲什麼我在我的答案中加入了一個關於這個問題的說明,請參閱我的更新答案 – Taryn 2013-02-21 19:55:29

+0

我想這就是我不明白的地方。如果我要運行簡單查詢:'SELECT name,min(hash)hash FROM my_table WHERE name LIKE'%An%'GROUP BY name;'我希望將'Anna'匹配到'ABC' 100%時間。我應該在什麼情況下獲得'JKL'? – Ryan 2013-02-21 21:37:07

1

試試這個

SELECT name , hash FROM my_table WHERE name LIKE '%An%' 
GROUP BY name; 

DEMO SQLFIDDLE HERE

2

當使用MySQL的GROUP BY,摧毀相同的查詢級別的倒序。

相反的:降序排列上

SELECT name, hash 
FROM my_table 
GROUP BY name 
ORDER BY name ASC, hash DESC 

使用子查詢:

SELECT * FROM(
    SELECT name, hash 
    FROM my_table 
    ORDER BY name ASC, hash DESC 
)Q 
GROUP BY name 
相關問題