我有一个mysql表(我们称其为“用户”),其中包含约700,000行数据。假设这是一个小样本:
UserID DeptID Name Score
1 2 Bob 50
2 2 Bob 100
3 3 Jane 32
4 4 Jill 93
5 2 Bob 50
6 3 Jane 58
7 7 Jane 44
我想显示所有具有重复的“名称”和“ DeptID”的行,但仅显示不同的“得分”。 (用户ID与选择无关,只需显示即可。)
UserID DeptID Name Score
1 2 Bob 50
2 2 Bob 100
3 3 Jane 32
6 3 Jane 58
所以基本上就像您从上方看到的那样,我不要显示另一个得分为50的Bob(用户ID 5)(即使他位于部门2)。
我有一部分查询工作,如下所示,除了它显示了所有鲍勃的东西,而且我不知道如何仅显示分数的不同之处 strong>。
SELECT A.UserID, A.DeptID, A.Name, A.Score
FROM User AS A
INNER JOIN (
SELECT Name, DeptID
FROM User
GROUP BY Name, DeptID
HAVING COUNT(*) > 1
) AS B ON A.Name = B.Name AND A.DeptID = B.DeptID
此查询在相当长的时间内运行。我尝试过的所有其他操作都给出了不正确的结果,出现了查询错误,或者查询一直运行下去,最终我终止了该过程。
我知道我缺少一些简单的东西,但是我很难知道它是什么。...
编辑-好的,Barmar的答案就是我想要的,谢谢! (猜猜我只是盯着我的SQL语句太长时间了,大声笑)
这是一个新的转折。我仅希望它显示特定的人, ,如果有2个(或更多)不同的分数(在同一个DeptID中)。因此,例如,如果只有两个Bob的两个都拥有50个(不存在100个),则不会显示任何一个。
答案 0 :(得分:1)
在末尾加上GROUP BY A.Name, A.Score
,这样名称和分数的每种组合都只会获得一行。
如果您只想显示它们在同一部门内有两个不同的分数,请使用COUNT(DISTINCT Score)
而不是COUNT(*)
。
SELECT A.UserID, A.DeptID, A.Name, A.Score
FROM User AS A
INNER JOIN (
SELECT Name, DeptID
FROM User
GROUP BY Name, DeptID
HAVING COUNT(DISTINCT Score) > 1
) AS B ON A.Name = B.Name AND A.DeptID = B.DeptID
GROUP BY A.Name, A.Score