MySQL совпадает с дубликатами в одном столбце и ТОЛЬКО отличается в другом столбце

0

У меня есть таблица 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 не существовало), ни один из них не отображался бы.

Теги:
duplicates
unique
distinct
self-join

1 ответ

1

Добавьте 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
  • 0
    Похоже, это должно быть GROUP BY A.DeptID, A.Name, A.Score из описания OP того, что GROUP BY A.DeptID, A.Name, A.Score .
  • 0
    Это сблизило меня, но потом я понял, что есть еще один шаг, которого я пытаюсь достичь. Я отредактировал свой первый пост внизу, чтобы попытаться объяснить.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню