如果你想在结果中,每个id一行,你可以使用GROUP BY id.但是,不建议使用SELECT列表中的其他列(即使MySQL允许它 – 这取决于您是否将ANSI设置为On或Off).建议使用具有聚合函数的其他列,如MIN(),MAX(),COUNT()等.在MySQL中,还有一个GROUP_CONCAT()聚合函数,它将从一个列的列中收集所有值:
SELECT
id
, COUNT(*) AS number_of_rows_with_same_id
, MIN(col1) AS min_col1
, MAX(col1) AS max_col1
--
, GROUP_CONCAT(col1) AS gc_col1
, GROUP_CONCAT(col2) AS gc_col2
--
, GROUP_CONCAT(col16) AS gc_col16
FROM
abc
GROUP BY
id ;
查询:
SELECT *
FROM abc
GROUP BY id ;
是无效的SQL(最多92个),因为您在SELECT列表中有非聚合结果,在SQL(2003)中有效.但是,它在这里是无效的,因为其他列在功能上不依赖于分组列(id).不幸的是,MySQL允许这样的查询,并且不检查功能依赖性.
所以,你永远不会知道将返回哪一行(具有相同id的许多行),甚至 – 恐怖! – 您从不同的行(具有相同的ID)获得结果.正如@Andriy评论的那样,结果是id之外的列的值将被任意选择.如果您想要可预测的结果,请不要使用这种技术.
示例解决方案:如果您只需要每个id中的一行,并且您有一个可用于排序的日期时间或时间戳(或其他一些)列,则可以执行以下操作:
SELECT t.*
FROM abc AS t
JOIN
( SELECT id
, MIN(some_column) AS m -- or MAX()
FROM abc
GROUP BY id
) AS g
ON g.id = t.id
AND g.m = t.some_column ;
只要(id,some_column)组合是唯一的,这将起作用.