Задать вопрос
@apptimeru

Как составить запрос один ко многим?

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

Есть 2 таблицы, одна основная например с фильмами, вторая дополнительная с мета данными. Каждый жанр привязывается к фильму по внешнему ключу и занимает свою строку в мета таблице.

Так вот проблема в том, что не могу вывести все фильмы, которые принадлежат сразу двум и более жанрам, получается что если использовать IN то выводятся все фильмы у которых есть хотя бы один жанр, а если через AND то вообще пустой результат.

Помогите пожалуйста составить правильный запрос.

Вот более наглядный пример:
5a73b1e11b102156942086.png

Нужно вытащить все названия фильмов, у которых жанры с ID (13,15,27), только не какой-то один, а обязательно только те фильмы у которых есть все 3 этих жанра.

Пример запроса:
SELECT * FROM films f 
     LEFT OUTER JOIN meta_films m ON m.id_films = f.id 
        WHERE m.meta_value IN(13,23)
  • Вопрос задан
  • 3064 просмотра
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
Stalker_RED
@Stalker_RED
select * from films f
  left join жанры...
  where жанры in(1,2,3)

  group by f.id
  having count ... < -- magic here


после группировки можно понять у какого фильма одно попадание, у какого два, и более.
https://dev.mysql.com/doc/refman/5.7/en/group-by-f...
www.dofactory.com/sql/having
Ответ написан
SELECT
    f.*
FROM
    films f
LEFT JOIN meta_films m ON
    m.id_films = f.id
    AND m.meta_value IN(13, 23)
WHERE
	m.id_films IS NOT NULL
Ответ написан
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Да ладно вам, простой запрос же.

select
	films.*
from meta
left join films on films.id = meta.id_films
where meta_value in (13,15,27)
group by id_films
having count(meta.id) = 3

В IN подставляете все нужные категории
having count = общее количество категорий запрошенных пользователем.

Если нужен не четкий поиск, можно например сделать вот так:
select
	films.*,
	count(meta.id) as cnt
from meta
left join films on films.id = meta.id_films
where meta_value in (13,15,27)
group by id_films

и дальше показывать юзеру по убыванию cnt
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы