mysql 在一列上匹配重复项,在另一列上仅不同
mysql match duplicates on one column and ONLY different on another column
我有一个 mysql table(我们称之为 'user'),其中包含大约 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
我想显示所有具有重复 '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(用户 ID 5)(即使他在部门 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
此查询在相当长的时间内运行。我尝试过的所有其他方法要么给出不正确的结果、查询错误,要么永远查询 运行,我最终终止了该进程。
我知道我遗漏了一些简单的东西,但我很难看清它是什么....
编辑 - 好的,Barmar 的回答正是我想要的,谢谢! (猜猜我只是盯着我的 SQL 陈述太久了,哈哈)
这里有一个新的变化。我 只 希望它显示特定的人 如果 有 2 个(或更多)不同的分数(在同一个 DeptID 中)。因此,例如,如果只有两个 Bob 的值都为 50(100 不存在),则两者都不会显示。
将 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
我有一个 mysql table(我们称之为 'user'),其中包含大约 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
我想显示所有具有重复 '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(用户 ID 5)(即使他在部门 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
此查询在相当长的时间内运行。我尝试过的所有其他方法要么给出不正确的结果、查询错误,要么永远查询 运行,我最终终止了该进程。
我知道我遗漏了一些简单的东西,但我很难看清它是什么....
编辑 - 好的,Barmar 的回答正是我想要的,谢谢! (猜猜我只是盯着我的 SQL 陈述太久了,哈哈)
这里有一个新的变化。我 只 希望它显示特定的人 如果 有 2 个(或更多)不同的分数(在同一个 DeptID 中)。因此,例如,如果只有两个 Bob 的值都为 50(100 不存在),则两者都不会显示。
将 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