小编典典

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

sql

如何仅返回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)。


阅读 196

收藏
2021-05-05

共1个答案

小编典典

DISTINCT 不能以这种方式工作,返回的所有列中的值都必须是不同的。

您可以始终在该函数上使用聚合函数,该hash函数GROUP BY name将为hash每个函数返回一个值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

从MySQL文档中:

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

2021-05-05