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

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

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
945
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

Похоже, это должен быть GROUP BY A.DeptID, A.Name, A.Score из описания желаемого OP.

dossy 26.10.2018 04:14

Это приблизило меня, но потом я понял, что есть еще один шаг, которого я пытаюсь достичь. Я отредактировал свой первый пост внизу, чтобы попытаться объяснить.

Jason 26.10.2018 04:41

Воспользуйтесь COUNT(DISTINCT Score), ответ обновил.

Barmar 26.10.2018 21:41

Другие вопросы по теме