SELECT строку из таблицы MySQL, где присутствуют все, без исключений, значения из WHERE

Рейтинг: 0Ответов: 1Опубликовано: 31.03.2015

Доброго времени суток!

Есть 3ри таблицы: t, t_s, s
В таблицах t и s по две колонки id и val
t_s, это соединяющая таблица с колонками id, t_id и s_id
В общем, структура взаимодействия, как не сложно догадаться, что-то типа этого:
t.val <-> t.id -> t_s.t_id <-> t_s.s_id <- s.id <-> s.val

Задача:
t.id пересекаются с s.id в таблице t_s. Мне нужно получить все t.val которые пересекается с s.val со значениями [SVal1 и SVal3], не какое-либо из введённых значений, а именно все ведённые значения (и SVal1, и SVal3).

Инструкция которая у меня получилась, выводит строки t.val которые пересекается с любой из искомых s.val:

SELECT val FROM t WHERE id IN (SELECT t_s.t_id FROM t_s
            LEFT JOIN s ON s.id = t_s.s_id
            WHERE s.val IN ('SVal1','SVal3'));

Визуальный пример:
Таблица t:

id:   Val:    
1     TVal1
2     TVal2
3     TVal3
4     TVal4

Таблица s:

id:   Val:    
1     SVal1
2     SVal2
3     SVal3
4     SVal4

Таблица t_s:

id:   t_id:   s_id:
1      2       1
2      1       3
3      3       4
4      4       1
5      1       1

Должен вернуть: TVal1
А не: TVal1, TVal2, TVal4

Надеюсь не слишком запутано )
Заранее спасибо за уделённое мне внимание.
P.S: Возможно, это не самая удачная схема взаимодействия 2х таблиц (t и s), где каждая из строк таблицы t, может пересекаться с любым количеством строк таблицы s – и наоборот. Буду рад любой альтернативе )

Ответы

▲ 1
SELECT t.val
  FROM t
  JOIN t_s ON t.id = t_s.t_id
  JOIN s ON s.id = t_s.s_id 
 WHERE s.val IN ('SVal1','SVal3')
 GROUP BY t.id HAVING COUNT(*) = 2;