0

数据库:

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

这是我到目前为止所做的,但我只得到逗号分隔值的名字。

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`,':', ','))) 

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

4

1 回答 1

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 所提示的,最好按一个真正的唯一值(名称可能不是唯一的)进行分组,因此如下所示:-

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
于 2013-06-11T15:43:06.887 回答