数据库:
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`,':', ',')))
用逗号替换我的字符串上的冒号,这样我就可以将它们视为数组。
答案 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