Я пытался это сделать часами и еще не понял этого.
Скажем, у меня есть 2 таблицы - мастер и детали.
master/detail имеет следующие данные
master table
+------+-------+
| id | name |
+------+-------+
| 1 | jeff |
| 2 | simon |
| 3 | andy |
| 4 | jerry |
+------+-------+
details table
+----+-----------+---------+
| id | master_id | tag |
+----+-----------+---------+
| 1 | 1 | WINDOWS |
| 2 | 1 | MAC |
| 3 | 2 | MAC |
| 4 | 3 | WINDOWS |
| 5 | 3 | MAC |
| 6 | 3 | LINUX |
| 7 | 4 | MAC |
+----+-----------+---------+
как выбрать основные записи, которые имеют оба тега "WINDOWS", "MAC".
Поэтому он должен возвращать только master_id 1 и 3, только jeff и andy.
Если я сделаю
select distinct(master_id) from details where tag in ('WINDOWS', 'MAC')
это дает мне все.
Извините за вопрос новичков, но если кто-то может помочь, он будет очень признателен.
Вам нужна простая GROUP BY
с предложением HAVING
:
select master_id
from details
where tag in ('WINDOWS', 'MAC')
group by master_id
having count(*) = 2;
Если в таблице данных есть повторяющийся tag
для master_id
вам нужно count(distinct tag)
.
Вы можете использовать соединение со счетом, имеющим 2 значения только для тега
select distinct master_id
from detail
inner join (
select master_id from detail
group by master_id
having count(distinct tag) = 2
) t on t.master_id = detail.master_id and detail.tag in ('WINDOWS', 'MAC')