mysql匹配一列中的重复项,而另一列中仅相同项

时间:2018-10-26 00:14:57

标签: mysql duplicates unique distinct self-join

我有一个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个),则不会显示任何一个。

1 个答案:

答案 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
相关问题