У меня есть база данных MySQL с таблицей media
, таблицей keywords
и отношением «многие ко многим» между media
и keywords
через таблицу соединений media_keywords
.
Я хочу получить все записи из таблицы мультимедиа, где соответствует следующий набор условий:
'description' is like 'dog' OR
'media.keywords' includes the id for the 'dog' keyword [100]
И исключить из найденного набора любые записи, где:
'description' is like 'cat' OR
'media.keywords' includes the id for the 'cat' keyword [400]
А также исключить любую строку, где:
'media.keywords' includes the id for the 'monochrome' keyword [500]
Я также хочу вернуть только отдельные строки, поэтому я использую GROUP By 'media.id'
Оператор SQL, который у меня есть на данный момент, выглядит следующим образом:
SELECT DISTINCT
`media`.`id`,`media`.`description`,
`keywords`.`id` AS `keywords.id`,
`keywords->media_keywords`.`id` AS `keywords.media_keywords.id`,
`keywords->media_keywords`.`media_id` AS `keywords.media_keywords.media_id`,
`keywords->media_keywords`.`keyword_id` AS `keywords.media_keywords.keyword_id`
FROM database.media
LEFT OUTER JOIN
(
`media_keywords` AS `keywords->media_keywords`
INNER JOIN `keywords` AS `keywords`
ON `keywords`.`id` = `keywords->media_keywords`.`keyword_id`
)
ON `media`.`id` = `keywords->media_keywords`.`media_id`
WHERE
(
(`media`.`description` LIKE '%dog%' )
OR `keywords`.`id` IN (100)
)
AND NOT
(
(`media`.`description` LIKE '%cat%' )
OR `keywords`.`id` IN (400,500)
)
GROUP BY `media`.`id` ;
Это корректно выбирает записи, где «собака» присутствует в описании или является ключевым словом, но полностью игнорирует исключения.
Кто-нибудь может увидеть, что я здесь делаю не так?