@kuznecov85

Как вывести данные?

Есть три таблицы:
films
filmsjanrs
janr

Т.е. фильмы и жанры. Как пример запроса, надо вывести все фильмы ужасы, но НЕ комедии.
Запрос
SELECT * 
FROM `films`
	left join `filmsjanrs` 
		left join `janr` on `filmsjanrs`.janrid = `janr`.id and `janr`.id <> 2
	on `films`.id = `filmsjanrs`.filmid 
	
WHERE `janr`.id = 1


Возвращает фильмы, которые относятся к жанру ужасы. Но среди них есть фильм, который одновременно относиться и к жанру комедии. Как правильно написать запрос?

Заранее большое спасибо =)

Структура таблиц:

CREATE TABLE IF NOT EXISTS `films` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ;

--
-- Дамп данных таблицы `films`
--

INSERT INTO `films` (`id`, `name`) VALUES
(1, 'Самый лучший фильм'),
(2, 'Пила 2'),
(3, 'Пила 3'),
(4, '18 мгновений весны'),
(5, 'ФильмМистика'),
(6, 'Американский пирог');

-- --------------------------------------------------------

--
-- Структура таблицы `filmsjanrs`
--

CREATE TABLE IF NOT EXISTS `filmsjanrs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `filmid` int(11) NOT NULL,
  `janrid` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

--
-- Дамп данных таблицы `filmsjanrs`
--

INSERT INTO `filmsjanrs` (`id`, `filmid`, `janrid`) VALUES
(1, 1, 2),
(2, 2, 1),
(3, 3, 1),
(4, 4, 3),
(5, 5, 4),
(6, 6, 2),
(7, 1, 1),
(8, 1, 6),
(9, 2, 8),
(10, 2, 6);

-- --------------------------------------------------------

--
-- Структура таблицы `janr`
--

CREATE TABLE IF NOT EXISTS `janr` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=16 ;

--
-- Дамп данных таблицы `janr`
--

INSERT INTO `janr` (`id`, `name`) VALUES
(1, 'Ужасы'),
(2, 'Комедия'),
(3, 'Мелодрама'),
(4, 'Мистика'),
(5, 'Детское кино'),
(6, 'Боевик'),
(7, 'Боевые исскуства'),
(8, 'Детектив'),
(9, 'Иторичексиий'),
(10, 'Фантастика'),
(11, 'Повседневность'),
(12, 'Приключения'),
(13, 'Психология'),
(14, 'Сверхестественное'),
(15, 'Фентези');
  • Вопрос задан
  • 294 просмотра
Решения вопроса 2
longclaps
@longclaps
SELECT movie.*
FROM movie
  JOIN movie_genre A ON movie.id = A.movie_id
  JOIN movie_genre B ON movie.id = B.movie_id
WHERE A.genre_name = 'horror' AND B.genre_name = 'comedy';
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT *
  FROM `films` AS `f`
  JOIN `filmsjanrs` AS `fj1` ON `fj1`.`filmid` = `f`.`id`
    AND `fj1`.`janrid` IN (SELECT `id` FROM `janr` WHERE `name` = 'Ужасы')
  LEFT JOIN `filmsjanrs` AS `fj2` ON `fj2`.`filmid` = `f`.`id`
    AND `fj2`.`janrid` IN (SELECT `id` FROM `janr` WHERE `name` = 'Комедия')
  WHERE `fj2`.`filmid` IS NULL

И поле `id` в `filmsjanrs` здесь лишнее, первичным ключом лучше сделать пару (`filmid`, `janrid`)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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