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