Есть таблица с названиями магазинов `mags`:
`mag_id`, `mag_name`
таблица с товарами, которые там продаются`tovs`:
`tov_id`, `tov_name`
и связующая таблица `mag_tov`:
`mt_mag_id`, `mt_tov_id`
Предположим есть товары 'молоко', 'колбаса', 'мясо', 'сыр', 'водка', 'чай', 'кофе', 'соль'. В каждом магазине одновременно продаются несколько разных товаров.
Что-то никак не могу сообразить — как выбрать магазины, в которых продаются сразу несколько из товаров, например 'молоко', 'мясо' и 'чай' одновременно.
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
просто вложенные запросы в мускуле очень большое зло.
Вообще для объединения таблиц «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