mysql在一列上匹配重复项,在另一列上只匹配不同项

lsmd5eda  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(425)

我有一个mysql表(我们称之为“user”),包含大约700000行数据。假设这里有一个小样本:

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

我想显示具有重复'name'和'deptid'的所有行,但只显示不同的'score'(userid与选择无关,它只需要显示。)

UserID  DeptID  Name    Score
1       2       Bob     50
2       2       Bob     100
3       3       Jane    32
6       3       Jane    58

所以基本上你可以从上面看到,我不想显示得分为50的另一个bob(userid5)(即使他在dept2)。
我有如下所示的查询工作的一部分,除了它显示所有的bob的,我不知道如何让它只显示哪里的分数是不同的。

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

此查询在相当长的时间内运行。我尝试过的其他方法要么给出不正确的结果,要么查询出错,要么查询永远运行,最后我终止了进程。
我知道我错过了一些简单的东西,但我很难看清它是什么。。。。
编辑-好吧,巴玛的答案正是我想要的,谢谢(我想我只是盯着我的sql语句看了太久,哈哈)
不过,这里有一个新的转折点。我只想它显示一个特定的人,如果有2个(或更多)不同的分数(在同一个部门)。例如,如果只有两个bob都有50个(100个不存在),那么两个bob都不会显示。

zazmityj

zazmityj1#

添加 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

相关问题