mysql连接,替换为逗号分隔的字符串

mysql连接,替换为逗号分隔的字符串,mysql,Mysql,数据库: table1 schema: name=q_values; columns= id, name; table2 schema: name=signup_protect; columns= first_name, last_name, uid; table3 schema: name=user_result; columns= uid, value_ids; table1 data: [1, forest], [2, mountains] table2 data: [test,

数据库:

table1 schema: name=q_values;  columns= id, name;
table2 schema: name=signup_protect;  columns= first_name, last_name, uid;
table3 schema: name=user_result;  columns= uid, value_ids;

table1 data: [1, forest], [2, mountains]
table2 data: [test, test, 123]
table 3 data: [123, {1:2}]
我需要提供此结果的查询:

test, test, {forest, mountains}
这意味着我将注册与uid上的结果连接起来,并将
value\u id
替换为
q\u value
名称

这是我到目前为止所做的,但我只得到comaseparated值的名字

SELECT `signup_protect`.`first_name`, `signup_protect`.`last_name`, 
 (select name from q_values where id in (replace(`user_results`.`value_ids`,':', ','))) 
 FROM (`signup_protect`) JOIN `user_results` ON `user_results`.`uid` = `signup_protect`.`uid`
我用

(select name from q_values where id in (replace(`user_results`.`value_ids`,':', ','))) 

用逗号替换字符串上的冒号,以便将其视为数组。

我还建议规范化数据库的设计

然而,如果做不到这一点,有两种方法是可能的。例如,类似这样的内容(未测试):-

别指望它会很快

根据Rocket Hazmat的提示,最好按照真正唯一的值进行分组(名称可能不唯一),因此如下所示:-

SELECT a.uid, a.first_name, a.last_name, GROUP_CONCAT(DISTINCT c.name)
FROM signup_protect a
INNER JOIN user_results b 
ON b.uid = a.uid
INNER JOIN q_values c
ON FIND_IN_SET(c.id, REPLACE(b.value_ids, ':', ',')) > 0
GROUP BY a.uid

请参阅表3中的数据是否按字面形式存储为
“{1:2}”
(5个字符)?问题是
中的
需要一个逗号分隔的列表,但您给它一个字符串。请看我的这个问题:并且请考虑不要在数据库中存储一个(逗号)分隔的列表,每个值应该有一行(做它,稍后你会感谢我)。我建议你把表3归一化。火箭HAZMAT,不,它是按1:2的方式存储的,这一个是有效的,但是当有一个以上的记录时,我不只是从value_id中得到c.name,但我得到的不仅仅是这个示例:对于这些id:2:23:42:45:57:76:82:92,我得到了所有这些名称:山脉、湿地、湿地、新奥尔良、鸡蛋、大米、大米、新鲜蔬菜、桃子、桃子、巧克力、馅饼、葡萄酒、咖啡、咖啡、茶、曲棍球、曲棍球、跑步、户外音乐、户外音乐、旅游、摄影、和平、和平、,社区,社区,朋友,朋友,鸟,马你可以添加一个独特的条款组_CONCAT应该解决这个问题(如果你的意思是删除重复)。我强烈建议你组的联系人的ID,而不是他们的名字!完全同意实际使用(并修改答案以符合此要求)
SELECT a.uid, a.first_name, a.last_name, GROUP_CONCAT(DISTINCT c.name)
FROM signup_protect a
INNER JOIN user_results b 
ON b.uid = a.uid
INNER JOIN q_values c
ON FIND_IN_SET(c.id, REPLACE(b.value_ids, ':', ',')) > 0
GROUP BY a.uid