SELECT
`players`.*
FROM
`players`
LEFT JOIN `players_modes` ON `players`.`id` = `players_modes`.`player_id`
LEFT JOIN `modes` ON `players_modes`.`mode_id` = `modes`.`id`
LEFT JOIN `players_styles` ON `players`.`id` = `players_styles`.`player_id`
LEFT JOIN `style` ON `players_styles`.`style_id` = `style`.`id`
WHERE
(`players`.`game_id` = '3') AND(`style`.`id` IN('3', '4', '5'))
Данный вариант не подходит потому что будут выбирать все записи в которых есть связи с id 3 или 4 или 5. А нужно выбирать запись только если есть эти связи. Пример: Если указать [1,2,3] и у одной из записей несколько связей(например: 1,2,3), а у другой (1,2,3,5) то in выберет обе записи.
Рабочий вариант которые делает то что нужно:
SELECT p.*
FROM players AS p
INNER JOIN players_styles ps ON p.id ps.player_id
WHERE p.game_id = '3' AND ps.style_id IN('3', '4', '5')
GROUP BY p.id HAVING COUNT(*) = 3
НО, с INNER JOIN нельзя будет использовать остальные JOIN'ы, а они нужны обязательно. Еще один вариант это делать подзапрос, но это затратно по ресурсам.
с INNER JOIN нельзя будет использовать остальные JOIN'ы
Кто тебе сказал такую глупость?
нужно выбирать запись только если только эти записи
SELECT `players`.*
FROM `players`
INNER JOIN `players_styles` ON `players`.`id` = `players_styles`.`player_id`
INNER JOIN `style` ON `players_styles`.`style_id` = `style`.`id`
LEFT JOIN `players_modes` ON `players`.`id` = `players_modes`.`player_id`
LEFT JOIN `modes` ON `players_modes`.`mode_id` = `modes`.`id`
WHERE `players`.`game_id` = '3'
GROUP BY `players`.`id`
HAVING SUM(`style`.`id` NOT IN ('3', '4', '5')) = 0
AND COUNT(DISTINCT `style`.`id`) = 3
Кстати. Таблицы players_modes и modes в запросе в принципе никак не используются. И их удаление опять же в принципе не может изменить результата, если не считать времени выполнения запроса.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости