比较mysql列表-检查一个列表是否包含在另一个列表中

de90aj5v  于 2023-03-22  发布在  Mysql
关注(0)|答案(2)|浏览(180)

我有一个电影表和一个类型表,以及电影和类型之间的关系(多对多)(代表电影的类型)我想得到所有的电影,他们的类型包括一个类型列表,所以我写了这个查询:

SELECT movie.name , JSON_ARRAYAGG(genre.name) FROM movie 
INNER JOIN movie_genre ON movie.id = movie_genre.movie_id 
INNER JOIN genre ON genre.id = movie_genre.genre_id 
GROUP BY movie.id;

这将返回一个表的名称和类型的电影列表。我想检查如果列表(spring Boot - jdbc会在查询中放入-例如-(“Action”,“Drama”))包含在JSON_ARRAYAGG中,并且必须获得具有这些类型的所有电影。如何在一个简单而有效的查询中检查一个列表是否是另一个列表的子集而不使用Tricks。

谢谢Idan。

vltsax25

vltsax251#

要检查每部电影的类型JSON数组中是否包含类型列表,可以使用MySQL中的JSON_CONTAINS_ALL()函数

SELECT movie.name, JSON_ARRAYAGG(genre.name) 
FROM movie 
INNER JOIN movie_genre ON movie.id = movie_genre.movie_id 
INNER JOIN genre ON genre.id = movie_genre.genre_id 
GROUP BY movie.id 
HAVING JSON_CONTAINS_ALL(JSON_ARRAY('Action', 'Drama'), JSON_ARRAYAGG(genre.name))
xytpbqjk

xytpbqjk2#

如果你只想过滤那些有你的类型列表的电影,你可以只过滤类型,然后过滤所有有类型行数的电影
像这样:

SELECT movie.name FROM movie
    JOIN movie_genre ON movie.id = movie_genre.movie_id 
    JOIN genre ON genre.id = movie_genre.genre_id 
    WHERE genre.name in ("thrill", "action")
    GROUP BY movie.name
    HAVING COUNT(genre.name) = 2

相关问题