У меня есть таблица 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", НО ТОЛЬКО разные "Оценка". (UserID не имеет значения для выбора, его просто нужно отобразить.)
UserID DeptID Name Score
1 2 Bob 50
2 2 Bob 100
3 3 Jane 32
6 3 Jane 58
Таким образом, как вы можете видеть из вышеизложенного, я не хочу показывать другого Боба (UserID 5) со счетом 50 (даже если он находится в отделе 2).
У меня есть часть запроса, работающая, как показано ниже, за исключением того, что он показывает всех Бобов, и я не знаю, как заставить его показывать только, где счет отличается.
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). Так, например, если бы было только два Боба, у обоих было 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
GROUP BY A.DeptID, A.Name, A.Score
из описания OP того, чтоGROUP BY A.DeptID, A.Name, A.Score
.