3

如何只返回 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(以及任何其他不同的匹配,如Andrewor Anthony)。

4

5 回答 5

10

DISTINCT不能那样工作,返回的所有列的值必须是不同的。

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

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 扩展GROUP BY

来自 MySQL 文档:

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

于 2013-02-21T19:43:40.920 回答
3

使用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
于 2013-08-21T16:41:29.813 回答
1

尝试这个

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

在这里演示 SQLFIDDLE

于 2013-02-21T19:46:20.237 回答
1
SELECT 
  name, hash 
FROM 
  my_table 
WHERE 
  name LIKE '%An%' 
GROUP BY 
  name;
于 2013-02-21T19:40:56.520 回答
0

DISTINCT提供唯一的数据行。在您的示例中,哈希是不同的,因此为什么您没有得到您想要的结果。

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

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

如果您需要它,但它不需要是唯一的,您可以添加一个GROUP BY子句,即GROUP BY name按名称对您的结果进行分组(只给您唯一的名称)。注意,usingGROUP BY表示当 name 为 'Anna' 时,hash 的值可以是 'ABC' 或 'JKL'。

于 2013-02-21T19:44:43.430 回答