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

时间:2013-06-11 15:28:48

标签: 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, test, 123]
table 3 data: [123, {1:2}]

我需要提供这个结果的查询:

test, test, {forest, mountains}

这意味着我将注册结果与uid一起加入,并将value_ids替换为q_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`,':', ','))) 

用逗号替换我的字符串上的冒号,这样我就可以将它们视为数组。

1 个答案:

答案 0 :(得分:2)

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

然而,失败的可能有两种方式。例如像这样(未经测试): -

SELECT 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.first_name, a.last_name

不要指望它快!

根据Rocket Hazmat的提示,GROUP BY最好是一个真正独特的值(名称可能不是唯一的)因此是这样的: -

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