最近,我一直在进行高级搜索和他的查询生成器。现在我面对一个小

问题,可以说在我的搜索中,我想包括所有具有genre_id 100和101的电影,所以基本上我应该只获得movie_id 10

 [Movie Table]
 movie_id  |title             |...
 10        |Bruce Almighty
 11        |Matrix

 [Movie Genres Table]
 movie_id | genre_id  |...
 10       |100
 11       |101
 10       |101
 ...      |...

 [movie Version Table]
 movie_id | version_id  |...
 10       |20
 10       |21
 11       |20
 10       |22

[movie language Table]
 movie_id | language_id  |...
 10       |30
 10       |40
 11       |11
 11       |14


查询如下:

 SELECT movie_id,title from movie WHERE title LIKE '%Bruce%'


我不能使用HAVING,因为我有更多字段可以完全相同,例如版本(标准,扩展等)。

任何想法如何解决这个问题?

更新:

我可能会继续添加XD这样的表,基本上是一对一的具有相同结构的关系表...而且我必须动态地构建查询(以便我只包含所需的条件)

最佳答案

只需使用仅包含与两个流派相关联的电影ID的IN子句。

SELECT movie_id, title
FROM movie
WHERE title LIKE '%Bruce%'
AND movie_id IN
(
  SELECT movie_id
  FROM movie_genre
  GROUP BY movie_id
  HAVING MIN(genre_id) = 100 AND MAX(genre_id) = 101
);


编辑:这是关于同一查询,只是功能更广泛(您可以具有更多的值,它们不需要相邻):

SELECT movie_id, title
FROM movie
WHERE title LIKE '%Bruce%'
AND movie_id IN
(
  SELECT movie_id
  FROM movie_genre
  GROUP BY movie_id
  HAVING
    MAX(CASE WHEN genre_id = 100 THEN 1 ELSE 0 END) = 1 AND
    MAX(CASE WHEN genre_id = 101 THEN 1 ELSE 0 END) = 1
    MAX(CASE WHEN genre_id NOT IN (100,101) THEN 1 ELSE 0 END) = 0
);

关于mysql - MySQL-条件列等于两个或多个值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24201705/

10-16 20:48