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

У меня есть таблица mysql (назовем ее '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

Я хочу показать все строки с одинаковыми «Именем» И «DeptID», НО ТОЛЬКО разными «Счетами».(Идентификатор пользователя не имеет значения для выбора, его просто нужно отобразить.)

UserID  DeptID  Name    Score
1       2       Bob     50
2       2       Bob     100
3       3       Jane    32
6       3       Jane    58

Так что, как вы можете видеть сверху, я не хочу показать другого Боба (UserID5) со счетом 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 не существовало), ни один из них не отображался бы.

1 Ответ

0 голосов
/ 26 октября 2018

Добавьте 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
...