我怎样才能返回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 }})。
答案 0 :(得分:9)
DISTINCT
不起作用,返回的所有列的值必须不同。
您始终可以在hash
函数和GROUP BY name
上使用聚合函数,该函数将为每个hash
返回一个name
值:
SELECT name, min(hash) hash
FROM my_table
WHERE name LIKE '%An%'
GROUP BY name;
注意:将聚合函数与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)
答案 4 :(得分:0)
DISTINCT
提供唯一的数据行。在您的示例中,哈希是不同的,因此您无法获得所需的结果。
问题:哈希用于什么?你需要它是独一无二的,还是不需要它?
如果您不需要它,请从SELECT
子句中删除它,您将拥有唯一的名称。
如果您需要它,但它不需要是唯一的,您可以添加GROUP BY
子句,即GROUP BY name
,它将按名称对结果进行分组(仅为您提供唯一的名称)。注意,使用GROUP BY
意味着当名称为'Anna'时,hash的值可以是'ABC'或'JKL'。