Название немного грязно, но вот пример, предположим, что у нас есть таблица:
| name | room |
=================
| John | 4 |
| John | 6 |
| John | 9 |
| Smith | 4 |
| Smith | 6 |
| Brian | 4 |
| Brian | 6 |
| Brian | 9 |
Я хочу выбрать Джона и Брайана, потому что у них обоих есть комнаты 4, 6 и 9, но не Смит, так как у него нет комнаты 9. (Если бы у нас был другой человек, у которого ТОЛЬКО есть комната 4 и 6, d выберите этого другого человека, а также Смита).
Я знаю, что мне нужно сделать какой-то коррелированный запрос, но я не уверен, как на самом деле заставить его делать что-то вроде
for a check for b
Если вам нужны группы имен, которые разделяют одни и те же комнаты, я бы рекомендовал group_concat()
:
select rooms, group_concat(name) as names
from (select name, group_concat(room order by room) as rooms
from t
group by name
) n
group by rooms;
Если вам нужны только комбинации с более чем одним именем, добавьте having count(*) > 1
во внешний select
.