如何仅返回MySQL中字段的第一个不同匹配项?
我的表:
name hash ---------------- Anna ABC Barb DEF Charlie GHI Anna JKL Andrea MNO
我的查询(用于%An%):
%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(以及任何其他不同的匹配项,例如Andrew或Anthony)。
Anna
Andrea
Andrew
Anthony
DISTINCT 不能以这种方式工作,返回的所有列中的值都必须是不同的。
DISTINCT
您可以始终在该函数上使用聚合函数,该hash函数GROUP BY name将为hash每个函数返回一个值name:
hash
GROUP BY name
name
SELECT name, min(hash) hash FROM my_table WHERE name LIKE '%An%' GROUP BY name;
请参阅带有演示的SQL Fiddle。
注意: 将集合函数与一起使用GROUP BY将确保您始终返回该hash列的期望值。如果您没有GROUP BY或汇总SELECT列表中的项目,则可能会返回意外结果。(请参阅的MySQL扩展GROUP BY)
GROUP BY
SELECT
从MySQL文档中:
MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。…您可以使用此功能来避免不必要的列排序和分组,从而获得更好的性能。但是,这主要在每个组的每个未聚合列中未在GROUP BY中命名的所有值都相同时才有用。服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。此外,通过添加ORDER BY子句不能影响从每个组中选择值。选择值之后,将对结果集进行排序,并且ORDER BY不会影响服务器选择的值。