【问题标题】:mysql self join with group_concat and without duplicatesmysql self join with group_concat 并且没有重复
【发布时间】:2015-07-10 14:48:53
【问题描述】:

我想删除数据库中的重复项。一个标准可以有多个重复项,然后将它们组合在一起。

假设 B 是 A 的副本,C 也是 A 的副本,那么应该有类似的结果

*id* | *duplicate*     
  A  | B, C

但现在结果是这样的:

*id* | *duplicate* 
  A  | B, C    
  B  | C

这当然是正确的。问题是,我希望已经在结果中显示为 duplicates 的 id 不会在 id 列中再次列出,并带有自己的重复项。

这里是一个例子:http://sqlfiddle.com/#!9/61692/1/0

有什么建议吗?

谢谢, 保罗

编辑:

这里是示例的来源(由 Zohar Peled 推荐):

CREATE TABLE duplicates
    (`id` int, `Name` varchar(7))
;

INSERT INTO duplicates
    (`id`, `Name`)
VALUES
    (1, 'Bob'),
    (2, 'Bob'),
    (3, 'Bob'),
    (4, 'Alice')
;

SELECT DISTINCT d1.`id`, GROUP_CONCAT(d2.`id`) as duplicates
FROM `duplicates` as d1, `duplicates` as d2 
WHERE 
d1.`id`< d2.`id` AND
d1.`Name`       = d2.`Name`   
GROUP BY d1.`id`

【问题讨论】:

  • 在 sqlfiddle 上创建一个示例很棒,但是如果 ir 失败了怎么办?我建议你在这里也复制 ddl 和 dml。

标签: mysql duplicates group-concat self-join


【解决方案1】:

这是一个相当非正统的解决方案,但是嘿...

SELECT MIN(x.id) id
     , GROUP_CONCAT(DISTINCT y.id) duplicates
  FROM duplicates x 
  JOIN duplicates y
    ON y.name = x.name 
   AND y.id > x.id
 GROUP
    BY x.name

【讨论】:

  • 这看起来不错!作为对其他人的解释:主要的“技巧”似乎是: MIN() 确保没有重复项,例如: id |重复 A | B, C, D B | A、C、D 和 GROUP BY 可能不是 id,而是搜索条件之一。谢谢!
  • 以及另一个成功示例的链接:sqlfiddle.com/#!9/3c592/7/0With Strawberry´s solution
猜你喜欢
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 2012-07-28
  • 2014-10-25
相关资源
最近更新 更多