mysql self join with group_concat 并且没有重复

Posted

技术标签:

【中文标题】mysql self join with group_concat 并且没有重复【英文标题】:mysql self join with group_concat and without duplicates 【发布时间】: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。 【参考方案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

以上是关于mysql self join with group_concat 并且没有重复的主要内容,如果未能解决你的问题,请参考以下文章

MySQL Left Join Subquery with *

Mysql Count with Inner join of two tables, Average Join

MySQL left join with 'b's limit

mysql练习----Self join

SQL UPDATE with INNER JOIN

Mysql LEFT JOIN with count 返回未知列