仅在使用WHERE ... IN和嵌入式SELECT

时间:2018-12-06 15:20:05

标签: mysql

MySQL 5.7

我有一个表mission_sets,其中有一个字段missions

mission_setsmissions是一个JSON数组。

这里是一个示例值 [1, 3, 5, 6, 8]

还有另一个missionsidmission_set中的数组匹配。missions

我想根据missionsmission_sets的值从missions获取任务。

我已经创建了这个MySQL查询

SELECT SUBSTRING(missions,2,CHAR_LENGTH(missions)-2) FROM mission_sets WHERE `id`=7

返回     1, 3, 5, 6, 8

因此,我试图使用此MySQL查询获取所有任务详细信息

SELECT * FROM missions
WHERE `id` IN(SELECT SUBSTRING(missions,2,CHAR_LENGTH(missions)-2) FROM mission_sets WHERE `id`=7)

问题是我在运行查询时只得到第一行1,而不是全部5行。

更新: 我也尝试过这种解决方案,但我仍然只能返回一排

SELECT * FROM missions
WHERE FIND_IN_SET(`id`,(SELECT SUBSTRING(missions,2,CHAR_LENGTH(missions)-2) FROM mission_sets WHERE `id`=7))>0

当我用实际值替换嵌入式SELECT查询时,我将所有行取回。

mission set table

mission table

Example Mission Set Table

Example Missions table

2 个答案:

答案 0 :(得分:0)

我们可以在此处尝试使用MySQL JSON函数。使用JSON_SEARCH将ID表连接到JSON数组表:

SELECT m.*
FROM missions m
INNER JOIN mission_sets ms
    ON JSON_SEARCH(ms.missions, 'all', m.id) IS NOT NULL;

Demo

答案 1 :(得分:0)

我需要JSON_TABLE,它在MySQL 5.7中不可用,因为我的数组保存为整数而不是字符串'[1、3、5、12、14]和'[“ 1”,“ 3”, “ 5”,“ 12”,“ 14”]'我无法使用JSON_CONTAINS。因此,我将使用应用程序层来解决此问题。