Выбор ГРУППЫ, чьи ЧЛЕНЫ в возрасте до X - PullRequest
0 голосов
/ 04 мая 2019

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

Если бы у меня был такой стол:

name | group | age
andy | 1     | 15
lisa | 1     | 16
matt | 2     | 24
...  | 3     | 15
...  | 3     | 26

Выбор группы с членами в возрасте 17 лет и младше вернет группу 1.

Я пытался использовать предложения GROUP BY ... HAVING ..., но это возвращает группу 1 и группу 3, поскольку в группе 3 есть член в возрасте 15.

Ответы [ 2 ]

2 голосов
/ 04 мая 2019

В основном вам нужно подсчитать членов каждой группы, а также подсчитать количество участников в возрасте до 17 лет. Для группы, где все участники моложе 17 лет, эти показатели будут одинаковыми. В MySQL вы можете сделать последнее с SUM(age <= 17), поскольку MySQL рассматривает логические значения как 1 или 0 в числовом контексте:

SELECT `group`
FROM groups
GROUP BY `group`
HAVING COUNT(*) = SUM(age <= 17)

Выход

group
1

Демонстрация на dbfiddle

1 голос
/ 04 мая 2019

Я бы сделал это, посмотрев на максимальный возраст:

SELECT `group`
FROM groups
GROUP BY `group`
HAVING MAX(age) <= 17;

Примечание. Предполагается, что age никогда не будет NULL.Если это возможно, вы должны объяснить, какую логику вы хотите обработать NULL значениями.

Я также должен отметить, что в большинстве подобных случаев у вас будет отдельная таблица групп.Если это так, то, вероятно, наиболее эффективным решением является not exists:

select g.*
from groups g
where not exists (select 1
                  from groupmembers gm
                  where gm.groupid = g.groupid and
                        gm.age > 17
                 );

Преимущество этого состоит в том, что все группы, отвечающие указанным вами условиям, даже не имеют членов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...