MySQL — выборка из таблицы многие ко многим

Помогите с запросом, плиз…

Есть таблица с названиями магазинов `mags`:
`mag_id`, `mag_name`

таблица с товарами, которые там продаются`tovs`:
`tov_id`, `tov_name`

и связующая таблица `mag_tov`:
`mt_mag_id`, `mt_tov_id`

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

Что-то никак не могу сообразить — как выбрать магазины, в которых продаются сразу несколько из товаров, например 'молоко', 'мясо' и 'чай' одновременно.
  • Вопрос задан
  • 19543 просмотра
Решения вопроса 1
@nmike
SELECT mags.*, COUNT(*) AS c
FROM mag_tov, tovs, mags
WHERE mt_tov_id = tov_id AND mt_mag_id = mag_id
AND tov_name IN ("ПЕРЕЧИСЛИТЕ_ЧТО_ХОТИТЕ")
GROUP BY mag_id
HAVING c = КОЛЛИЧЕСТВО_ТОГО_ЧТО_ХОТИИТЕ

если надо 'молоко', 'мясо' и 'чай'

то
SELECT mags.*, COUNT(*) AS c
FROM mag_tov, tovs, mags
WHERE mt_tov_id = tov_id AND mt_mag_id = mag_id
AND tov_name IN ('молоко', 'мясо' и 'чай')
GROUP BY mag_id
HAVING c = 3


просто вложенные запросы в мускуле очень большое зло.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Zamorozka
select mt.mt_mag_id from mag_tov mt
where mt.mt_tov_id in (select tov_id from tovs where tov_name in ('молоко', 'мясо' и 'чай'))
Ответ написан
pratamishus
@pratamishus
Вообще для объединения таблиц «many-to-many» обычно используется JOIN, т.к. специально создан для оптимального объединения таблиц

SELECT m.*, t.* FROM (mags m JOIN mag_tov mt ON m.mag_id=mt.mt_mag_id) JOIN tovs t ON mt.mt_tov_id=t.tov_id WHERE tov_name IN ('молоко', 'мясо', 'чай')

Так же можете использовать LEFT OUTER JOIN и/или RIGHT OUTER JOIN если, например, хотите выводить товары, которые еще не занесены в таблицу mag_tov
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы