一个Select语句中的多级MYSQL查询

时间:2014-11-04 12:05:49

标签: mysql concatenation multi-level

这里非常简单的SQL问题 - 我在三个表中分布了三个级别的数据。 表1-列表表2 - 兴趣表3 - 消息

表1 - >表2和表2 - >表3具有一对多关系

始终会有商家信息,但每个商家信息可能有也可能没有兴趣,每个商家都可能有消息,也可能没有消息。

我想要做的是选择 1 Select Statement 中的所有信息,以避免多次数据库调用。

我知道两个级别的信息您可以使用GROUP_CONCAT和GROUP BY将所有二级信息抓取到一个连接的字符串列中。如果我只想使用一个选择,我只是不知道如何处理三个级别。 我也知道如何通过两个单独的调用和两者之间的PHP / python脚本来完成,但我想避免这种性能。

理想情况下,我会找回一个看起来像这样的数组:

array(
     '1'=>array(listingId'=>1, 
                interests=>
                           array(
                                 array(
                                       'interestId'=>2
                                       'messages'=>array(
                                                         'messageId'=>5,
                                                         'message'=>'hi'
                                                         ),
                                                   ...
                                       ),
                                ...
                                ),
                          ...
                ),
     ...
     )

另一个理想的情况是获得:

 array(
     '1'=>array(listingId'=>1, 
                interests=>
                           array(
                                 array('interestId'=>2,
                                       'messages'=>INSERT CONCATENATED STRING HERE
                                      ),
                                 ...
                                ),
                           ...
                ),
     ...
     )

在这种情况下,我可以使用PHP / Python / Ruby脚本来解析串联的消息字符串。

点代表更多具有类似数据的数组。

尝试使用连接时最重要的问题是您只能使用子选择拉回一列。

提前致谢! :)

1 个答案:

答案 0 :(得分:1)

你不能加入所有表吗?

SELECT * FROM table1, table2, table3 WHERE table3.ref=table2.id AND table2.ref=table1.id

我不知道您使用的是哪个外国索引,所以我只使用了refid

[编辑] 在1次调用中,另一个解决方案是使用不同的GROUP_CONCAT指令,使用不同的分隔符,如下所示:

SELECT naam,GROUP_CONCAT(t4.messages SEPARATOR '#') FROM test_listing t1 LEFT JOIN (SELECT t2.id,t2.ref,GROUP_CONCAT(message SEPARATOR '=') as messages FROM test_message t3 RIGHT JOIN test_interest t2 ON t2.id=t3.ref GROUP BY t2.id) t4 ON t1.id=t4.ref GROUP BY t1.id

这将返回与您有列表一样多的记录,然后将所有消息与分隔符' ='组合在一起,然后将所有这些消息与'#'

我没有看到更优雅的解决方案来解决这个问题!此外,在Join Table To a nested array [PHP/MYSQL]主题上也没有更优雅的解决方案。