如何从MySQL中的字段中仅选择第一个不同的匹配?

Rya*_*yan 2 mysql sql group-by distinct

我怎样才能返回MySQL中字段的第一个不同匹配?

我的表:

name     hash
----------------
Anna     ABC
Barb     DEF
Charlie  GHI
Anna     JKL
Andrea   MNO
Run Code Online (Sandbox Code Playgroud)

我的查询(for %An%):

SELECT DISTINCT(name) as name, hash FROM my_table WHERE name LIKE '%An%';
Run Code Online (Sandbox Code Playgroud)

返回:

name     hash
----------------
Anna     ABC
Anna     JKL
Andrea   MNO
Run Code Online (Sandbox Code Playgroud)

而不是:( 我之后的结果)

name     hash
----------------
Anna     ABC
Andrea   MNO
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得每个不同名称的第一个匹配?

我想返回第一个Anna,跳过第二个(和任何后续匹配),但仍然得到Andrea(和任何进一步的不同匹配,如AndrewAnthony).

Tar*_*ryn 9

DISTINCT 不起作用的方式,返回的所有列的值必须是不同的.

您始终可以在函数上使用聚合函数,hash并为每个函数GROUP BY name返回一个hashname:

SELECT name, min(hash) hash
FROM my_table 
WHERE name LIKE '%An%' 
GROUP BY name;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.

注意:使用聚合函数GROUP BY将确保始终返回hash列的预期值.如果您没有GROUP BY或聚合SELECT列表中的项目,则可能会返回意外结果.(参见MySQL ExtensionsGROUP BY)

来自MySQL Docs:

MySQL扩展了GROUP BY的使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列....您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能.但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用.服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的.此外,添加ORDER BY子句不会影响每个组中值的选择.选择值后会对结果集进行排序,而ORDER BY不会影响服务器选择的值.