使用Group By从Mysql表中删除重复记录

时间:2015-08-24 06:00:36

标签: mysql

我有一个表结构和数据如下。 enter image description here

我需要从表格列表中删除重复记录。我的困惑是当我解雇查询时

SELECT * FROM `table` GROUP BY CONCAT(`name`,department)

然后给我正确的清单(12条记录)。

enter image description here

使用子查询时的相同查询:

SELECT * 
FROM `table` WHERE id IN (SELECT id FROM `table` GROUP BY CONCAT(`name`,department))  

返回所有错误的记录。

Table Structure

所以,我的问题是为什么子查询中的group by不是在调用。

3 个答案:

答案 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结果。

enter image description here

演示SQL小提琴http://sqlfiddle.com/#!9/d715a/1