Обнаружение только определенных основных элементов из таблицы «Детали» в отношении «Таблица основных данных»

0

Я пытался это сделать часами и еще не понял этого.

Скажем, у меня есть 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')

это дает мне все.

Извините за вопрос новичков, но если кто-то может помочь, он будет очень признателен.

Теги:

2 ответа

1
Лучший ответ

Вам нужна простая 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).

  • 0
    Да, но, вероятно, он также хочет имена.
  • 0
    Спасибо, Йогеш! Как бы вы это сделали, если бы у меня была другая таблица с именем details2 с такой же структурой, но с разными тегами? Используя запрос выше, я бы получил правильные записи для каждой таблицы. Просто нужно выяснить, как обрабатывать несколько таблиц с SQL, если это возможно?
Показать ещё 1 комментарий
0

Вы можете использовать соединение со счетом, имеющим 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')
  • 0
    Спасибо! Любая идея, как сделать этот запрос с другой таблицей, например, details2 с той же структурой?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню