Py学习  »  DATABASE

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

jason • 4 年前 • 755 次点击  

我有一个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  DeptID  Name    Score
1       2       Bob     50
2       2       Bob     100
3       3       Jane    32
6       3       Jane    58

所以基本上你可以从上面看到,我是 想给另一个bob(用户id 5)显示50分(即使他在部门2)。

我的部分查询如下所示,只是它显示了所有的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语句看太久了,哈哈)

不过,这是一个新的转折点。我 只有 想让它显示一个特别的人 如果 有两个(或更多)不同的分数(在同一个部门内)。例如,如果只有两个鲍伯的两个都有50个(100个不存在),那两个都不会显示。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47175
 
755 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Barmar
Reply   •   1 楼
Barmar    5 年前

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