mySQL Left Join on multiple values (REPLACE AND SUBSTRING_INDEX FUNCTION failed)

mySQL Left Join on multiple values (REPLACE AND SUBSTRING_INDEX FUNCTION failed)

我正在尝试加入 2 tables tbl_questionstbl_answers.

tbl_questions 包含 qid 和答案列 tbl_answers 存储 answerid 和 answerdesc 列。

tbl_questions 数据通过用 ["answer"] 封装并用逗号分隔来存储多项选择答案 ["16672","16673","16676"] any [=33= 】 多项选择题答案是这样存储的16688。 我必须报告此数据并且无法对任何多项选择题进行连接,可以理解地返回空白。

我已尝试 运行 table

上的以下内容
REPLACE(REPLACE(REPLACE(answer,'"',''),'[',''),']','') FROM tbl_questions

这将清除对 16672,16673,16676 的多项选择答案 然后我用逗号分隔答案

SELECT Userid,SUBSTRING_INDEX(answer,',',1) as 'Option 1',
SUBSTRING_INDEX(SUBSTRING_INDEX(answer,',',2),',',-1) AS 'Option 2',
SUBSTRING_INDEX(SUBSTRING_INDEX(answer,',',-2),',',1) AS 'Option 3',
SUBSTRING_INDEX(answer,',',-1) AS 'Option 4'
FROM tbl_questions

这会创建新列选项 1 - 4,但仍然没有解决我的问题,因为单个答案出现在所有新列选项 1 -4 中。 我不觉得我为解决问题所采取的路线会奏效。 有谁知道我将如何加入论文 tables.

谢谢

您应该首先尝试修复您的架构,并有一个单独的 table 来存储每个问题的每个可能答案,每个 question/answer 元组一行。这将正确地表示您的实体之间的关系,并使查询更加容易和高效。

如果这不是您的选择,那么另一种选择是 find_in_set():

select ...
from tbl_questions q
inner join tbl_answers a 
    on find_in_set(
        a.answer_id,
        replace(replace(replace(q.answer,'"',''),'[',''),']','') 
    )
    

您也可以考虑使用 JSON 函数,因为 MySQL 可以理解您的字符串格式(这需要 MySQL 5.7 或更高版本):

select ...
from tbl_questions q
inner join tbl_answers a 
    on json_contains(replace(replace(q.answer,'"',''), a.answer_id)