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

时间:2013-02-21 19:37:44

标签: mysql sql group-by distinct

我怎样才能返回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(以及任何其他不同的匹配,例如Andrew或{{1 }})。

5 个答案:

答案 0 :(得分:9)

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 :(得分:2)

当使用GROUP BY, MySQL时,在同一查询级别销毁desc顺序。

而不是:

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

试试这个

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

DEMO SQLFIDDLE HERE

答案 4 :(得分:0)

DISTINCT提供唯一的数据行。在您的示例中,哈希是不同的,因此您无法获得所需的结果。

问题:哈希用于什么?你需要它是独一无二的,还是不需要它?

如果您不需要它,请从SELECT子句中删除它,您将拥有唯一的名称。

如果您需要它,但它不需要是唯一的,您可以添加GROUP BY子句,即GROUP BY name,它将按名称对结果进行分组(仅为您提供唯一的名称)。注意,使用GROUP BY意味着当名称为'Anna'时,hash的值可以是'ABC'或'JKL'。