Screatch
@Screatch
Ruby On Rails front-end developer

Исключение определённых ID с условием ИЛИ работает некорректно?

Предположим что у меня есть база фильмов с жанрами и я хотел бы сделать возможность исключать определённые жанры с условием ИЛИ т.е. если у фильма есть хотя бы один из исключаемых жанров, его следует исключить из выборки. Казалось бы тривиальная задача. Окей. Т.к. мы будем использовать Ruby on Rails, мы ведь не будем писать raw sql запросы, правда ведь? Поэтому для этих целей я нашёл соответствующий Gem и смог казалось бы вполне логично составить запрос, не буду вас утруждать реализацией, если интересно, можете посмотреть мой вопрос на Stackoverflow, где мне пока к сожалению не спешат отвечать.



Скажу лишь что конечный запрос MySQL который формирует active record получается примерно таким



SELECT `movies`.* FROM `movies` 
INNER JOIN `movie_genres` ON `movie_genres`.`movie_id` = `movies`.`id` 
WHERE ((`movie_genres`.`genre_id` != 10 OR `movie_genres`.`genre_id` != 12)) 
GROUP BY `movies`.`id`;




Но не очень рабочий. См. скриншот

m7S6G.png



Несмотря что запись казалось бы попадает под условие (у фильма есть жанр 10), он всё равно показывается.



В чём может быть проблема и где стоит начать копать?



Спасибо большое.
  • Вопрос задан
  • 6630 просмотров
Решения вопроса 1
@edogs
Одна из тех ситуаций, когда M2M не айс.

Делайте exclude грубо говоря
SELECT `movies`.* FROM `movies` 
INNER JOIN `movie_genres` ON `movie_genres`.`movie_id` = `movies`.`id` 
WHERE movies.id not in 
(
select movies.id from movies left join movie_genres on movies.id=movie_genres.movie_id 
where movie_genres.genre_id in (10,12)
)
GROUP BY `movies`.`id`;
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
nochkin
@nochkin
А какой вопрос? Если интересно что не так с запросом на RoR, то было бы полезно его увидеть.
Сам sql запрос смотрится слишком странно, так как genre_id по-любому не сможет быть равен 10 и 12 одновременно. Если я правильно понял задачу (тут она тоже не описана), то надо делать AND вместо OR. То есть, если фильм не имеет жанр 10 и не имеет жанр 12.
Ответ написан
Aleks_ja
@Aleks_ja
SELECT `movies`.* FROM `movies` 
INNER JOIN `movie_genres` ON `movie_genres`.`movie_id` = `movies`.`id` 
WHERE ((`movie_genres`.`genre_id` != 10 AND `movie_genres`.`genre_id` != 12)) 
GROUP BY `movies`.`id`;

Вот так
Ответ написан
Ваш ответ на вопрос

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

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