我正在尝试创建一个检查重复项的查询,如果我发现重复项,我希望能够相应地更新这些重复项。例如,我有以下数据集,我如何只选择“位置”具有相同值的2行?
ID position 1 0 2 1 3 2 4 1 5 3
在这个例子中,我只选择第2行和第4行。
答案 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