MySql список всех полей, имеющих сумму> 0 - PullRequest
0 голосов
/ 23 мая 2018

Некоторое время назад у меня возник вопрос, как написать SQL-запрос с несколькими count(), , и я получил здесь необходимый ответ .

Теперь, скажем, у меня точно такая же таблица

ID|group_name|username
----------------------
1 |    A     | user1
----------------------
2 |    B     | user2
----------------------
3 |    C     | user1

...

И точно такой же запрос:

select count(*) from TABLE 
where username='user1'
having (sum(group_name ='A') > 0
     and sum(group_name = 'B') > 0)
     or sum(group_name = 'C') > 0")

Но теперь я хочу не считать, а перечислить все имена пользователей , которые соответствуют этому havingзаявление.То есть перечислите все имена пользователей , которые находятся как в A, так и в B, или в группе C .

Пока я пробовал только заменить count(*) на username и добавить group by username в запросе и в моем запросе, например так:

select username where username='user1' having (sum(group_name ='A') > 0 and sum(group_name = 'B') > 0) or sum(group_name = 'C') > 0") group by username

Но я получаю синтаксисошибка:

В вашем синтаксисе SQL есть ошибка;обратитесь к руководству, соответствующему вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'GROUP BY username LIMIT 0, 25' в строке 1

Буду признателен за любую помощь.

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Объединение по имени пользователя и перемещение вашей логики WHERE в предложение HAVING:

SELECT username
FROM yourTable
GROUP BY username
HAVING
    SUM(CASE WHEN group_name NOT IN ('A', 'B') THEN 1 ELSE 0 END) = 0 OR
    SUM(CASE WHEN group_name NOT IN ('C') THEN 1 ELSE 0 END) = 0;

Обратите внимание, что ваша текущая логика WHERE на самом деле не соответствует тому, что вы написали, если вы действительно хотитепользователи, которые являются исключительно A / B или C.

0 голосов
/ 23 мая 2018

Вы можете использовать этот запрос, чтобы получить username s, которые соответствуют заданным критериям:

select username from users having (count(group_name ='A') > 0 and count(group_name = 'B') > 0) or count(group_name = 'C') > 0;

Мы пытаемся получить username s из users, которые имеют записи для обоих group_name sA и B, или есть запись для group_name C.

Надеюсь, это поможет.

0 голосов
/ 23 мая 2018

Чтобы указать имя пользователя, которое удовлетворяет вашим критериям, вы можете написать запрос как

select username
from table
group by username
having (
    sum(group_name ='A') > 0 and sum(group_name = 'B') > 0
) or sum(group_name = 'C') > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...