Выборка только с определенными связями

319
08 марта 2018, 09:06
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'ы, а они нужны обязательно. Еще один вариант это делать подзапрос, но это затратно по ресурсам.

Answer 1

с 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 в запросе в принципе никак не используются. И их удаление опять же в принципе не может изменить результата, если не считать времени выполнения запроса.

READ ALSO
CGI-программа на С#

CGI-программа на С#

Извиняюсь за неразборчивость, так как столкнулся с этим впервые и мало что в этом понимаю

332
Изменение запроса, equals и is null

Изменение запроса, equals и is null

Доброго времени суток! Мне необходимо получить записи не только с родителями, но и без, для которых ParentTitle будет равен nullКаким образом изменить...

338
yield MemoryLeaks

yield MemoryLeaks

Решил я попробовать использовать yield в своем проекте и столкнулся с проблемой утечки памяти

307
Как ограничить вывод значения

Как ограничить вывод значения

У меня есть переменная типа float, у которой после запятой много цифрМне хотелось бы ограничить её до одного знака после запятой

342