这里非常简单的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脚本来解析串联的消息字符串。
点代表更多具有类似数据的数组。
尝试使用连接时最重要的问题是您只能使用子选择拉回一列。
提前致谢! :)
答案 0 :(得分:1)
你不能加入所有表吗?
SELECT * FROM table1, table2, table3 WHERE table3.ref=table2.id AND table2.ref=table1.id
我不知道您使用的是哪个外国索引,所以我只使用了ref
和id
。
[编辑]
在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]主题上也没有更优雅的解决方案。