仅选择不唯一的行[MySQL]

时间:2010-06-29 03:46:34

标签: mysql aggregate-functions

我正在尝试创建一个检查重复项的查询,如果我发现重复项,我希望能够相应地更新这些重复项。例如,我有以下数据集,我如何只选择“位置”具有相同值的2行?

ID          position
1           0
2           1
3           2
4           1
5           3

在这个例子中,我只选择第2行和第4行。

3 个答案:

答案 0 :(得分:3)

SELECT t.position, 
    count(t.*) AS count 
FROM table t
GROUP BY position 
HAVING count(position) > 1

应该返回一份职位列表及其重复次数。

编辑:忽略我的表格别名

如果要查看具有重复位置的行,请尝试:

SELECT t1.ID,
    t1.position,
    t2.ID,
    t2.position
FROM table t1
INNER JOIN table t2
    ON t1.ID < t2.ID
    AND t1.position = t2.position

这将为您提供一组行(4列),其中有重复项。一个副本将获得1行,一个副本将获得3行,四元组将获得6个,并且从该点开始增加。

答案 1 :(得分:0)

为了扩展Matt S的答案(正确的话),您可以使用他的结果并加入原始表格以获得确切的行:

select
    id
    ,position
from table t
    join (
        select t1.position
        from table t1
        group by t1.position
        having count(*) > 1
    ) list
    on t.position = list.position

在WHERE子句中使用CTE或EXISTS()函数会使这更容易阅读,但我不知道MySQL在语法上支持什么(我是一个T-SQL人:))。这应该是ANSI。

答案 2 :(得分:0)

Matt S的答案是你通常会得到你想要的东西。为了略微扩展scottE的答案(因为我们正在谈论MySQL),如果输出令人满意,你也可以使用group_concat()来汇总你正在寻找的信息。

SELECT group_concat(ID) as 'IDs', position
FROM table
GROUP BY position
HAVING count(position) > 1

应该给你回复:

ID |职位
2,4 | 1