MYSQL:查找给定字符串JSON_ARRAY的元素

问题描述 投票:1回答:2

我已经尝试找出一种方法来查找给定字符串JSON_ARRAY的元素。我要实现的是contains all功能。

说我有一个名为Movies的表,其列为namegenre,而一个名为Genre的表,其列为id

电影

NAME      GENRE
Batman    1 
Batman    2  
Aquaman   2  
Joker     3  
IT        4  

流派

ID   NAME
1    Drama 
2    Action  
3    Thriller  
4    Horror    

现在,如果我有一个JSON_ARRAY与

SET @array = JSON_ARRAY("Action", "Drama");  

[给定此JSON_ARRAY给我Batman的存储过程如何创建?我认为解决方案是SQL递归,但是我不确定...

SET @array = JSON_ARRAY("Action", "Drama");  
sproc.GetMovieGivenGenres(@array, @out_movie);
SELECT @out_movie; --> Batman
mysql sql recursive-query
2个回答
0
投票

我们可以尝试使用JSON_SEARCH()函数,该函数具有搜索JSON数组的能力:

SELECT
    m.NAME
FROM Movies m
INNER JOIN Genre g
    ON m.GENRE = g.ID
GROUP BY
    m.NAME
HAVING
    COUNT(CASE WHEN JSON_SEARCH(@array, 'one', g.NAME) IS NOT NULL THEN 1 END) =
    JSON_LENGTH(@array);
对于每个电影,

JSON_SEARCH函数将在输入数组中找到给定类型的情况下返回非NULL值。匹配的电影是在输入数组中包含所有流派的电影。


0
投票

在mySQL 8中,您可以使用JSON_TABLE()将JSON格式转换为表。然后,您可以将生成的表与两个表连接起来:

SET @array = JSON_ARRAY("Action", "Drama");  

select m.NAME
from json_table(
  @array,
  '$[*]' columns (genre_name varchar(50) path '$')
) j
join Genre g on g.NAME = j.genre_name
join Movies m on m.GENRE = g.ID
group by m.NAME
having count(*) = json_length(@array);

db-fiddle demo

这样,MySQL将能够使用Genre(NAME)上的索引。

© www.soinside.com 2019 - 2024. All rights reserved.