У меня есть таблица 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
Я хочу показать все строки с повторяющимися «Name» И «DeptID», НО ТОЛЬКО разные «Score». (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
Этот запрос выполняется в течение приличного времени. Все остальное, что я пробовал, либо давало неверные результаты, либо ошибку запроса, либо запрос выполнялся бесконечно, и я, наконец, убил процесс.
Я знаю, что мне не хватает чего-то простого, но мне трудно понять, что это такое ...
РЕДАКТИРОВАТЬ - Хорошо, ответ Бармара был тем, что я искал, спасибо! (Думаю, я просто слишком долго смотрел на свой 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
Это приблизило меня, но потом я понял, что есть еще один шаг, которого я пытаюсь достичь. Я отредактировал свой первый пост внизу, чтобы попытаться объяснить.
Воспользуйтесь COUNT(DISTINCT Score)
, ответ обновил.
Похоже, это должен быть
GROUP BY A.DeptID, A.Name, A.Score
из описания желаемого OP.