Подтвердить что ты не робот

Использование предложения MySQL IN как все включено (AND вместо OR)

У меня есть список предметов на сайте. У каждого предмета есть несколько категорий, связанных с ним, позвольте назвать эти категории жанрами фильмов. В расширенном поиске я даю людям флажки для жанров, которые им нравятся, и выплескивает список фильмов, соответствующих ЛЮБОЙ из выбранных жанров.

У меня есть такой запрос:

AND column IN ('5', '8', '9')

Проблема в том, что если вы выберете "анимацию" и "ужас" , вы получите кучу мультфильмов Disney ( "анимация" ) и серии SAW ( "ужас" ).

Я хотел адаптировать поиск, чтобы он был включен, поэтому он будет возвращать только результаты, соответствующие ALL выбранных жанров, поэтому элементы, отмеченные как "анимация", так и "ужас" , будут возвращены.

Партии item_id и category_id хранятся в отдельной таблице. Таким образом, для фильма с идентификатором 55 может быть 4 жанра, поэтому будет 4 строки с item_id = 55, а category_id равно 4 идентификаторам категории.

4b9b3361

Ответ 1

EDIT. Изменен мой ответ, чтобы более точно соответствовать редактируемому вопросу.

select i.MovieName
    from item i
        inner join ItemCategory ic
            on i.item_id = ic.item_id
    where i.item_id = 55
        and ic.category_id in ('5','8','9')
    group by i.MovieName
    having count(distinct ic.category_id) = 3

Ответ 3

Если вы используете adhoc-запросы, вы можете создать что-то вроде этого

select *
from item_id t0
left join category_id t1 on t1.itemId=t0.Id and t1.gemres = 5
left join category_id t2 on t2.itemId=t0.Id and t2.gemres = 8
left join category_id t3 on t3.itemId=t0.Id and t3.gemres = 9
where (t1.Id is not null and t2.Id is not null and t3.Id is not null)

Ответ 4

Если список значений имеет более одного значения, вы можете легко его оптимизировать. Например:

AND (column = 5 AND column = 8 AND column = 9)

становится:

AND (column = 5 AND 5 = 8 AND 8 = 9 )

(так как отношение равенства является транзитивным). Которая может быть дополнительно оптимизирована как:

AND false

который явно дает те же результаты, что и запрос, о котором вы спрашиваете, и действительно, очень быстро работает в большинстве баз данных.

Серьезно, можете ли вы перефразировать вопрос?