我需要从表格列表中删除重复记录。我的困惑是当我解雇查询时
SELECT * FROM `table` GROUP BY CONCAT(`name`,department)
然后给我正确的清单(12条记录)。
使用子查询时的相同查询:
SELECT *
FROM `table` WHERE id IN (SELECT id FROM `table` GROUP BY CONCAT(`name`,department))
返回所有错误的记录。
所以,我的问题是为什么子查询中的group by
不是在调用。
答案 0 :(得分:1)
在查询中
SELECT * FROM `table` GROUP BY CONCAT(`name`,department)
您正在选择id
列,这是一个非聚合列。许多RDBMS会给你一个错误,但MySQL出于性能原因允许这样做。这意味着MySQL必须选择哪个记录保留在结果集中。根据原始问题中的结果集,如果一个组有多个成员,则MySQL似乎保留第一个重复记录的id
。
在查询中
SELECT *
FROM `table`
WHERE id IN
(
SELECT id FROM `table` GROUP BY CONCAT(`name`,department)
)
您还在子查询中选择非聚合列。看来MySQL实际上根据外部查询中的id
值确定要在子查询中保留哪个id
值。也就是说,对于id
中的每个table
值,MySQL执行子查询,然后有选择地选择在两个id
值匹配时保留组中的记录。
您应该避免在GROUP BY
的查询中使用非聚合列,因为它违反了ANSI标准,正如您在此处看到的那样,它可能会导致意外结果。如果您向我们提供有关您想要的结果集的更多信息,我们可以为您提供正确的查询,以避免此问题。
我欢迎有文档支持这些观察的任何人编辑我的问题或发布新问题。
答案 1 :(得分:1)
实际上正如Tim在他的回答中提到的那样,通过group by子句获得第一个唯一记录不是sql的标准功能,但是mysql允许它直到mysql5.6.16版本,但从5.6.21开始它已被更改。
只需在你的sql小提琴中更改mysql版本,并检查你是否会得到你想要的内容。
答案 2 :(得分:1)
您可以使用表格ID JOIN
分组ID ,以便获得所需的结果。
示例:
SELECT t.* FROM so_q32175332 t
JOIN ( SELECT id FROM so_q32175332
GROUP BY CONCAT( name, department ) ) f
ON t.id = f.id
ORDER BY CONCAT( name, department );
此处添加order by
只是为了直接比较*
上的group
结果。
演示SQL小提琴:http://sqlfiddle.com/#!9/d715a/1