SQL Query用于连接包含多行的多个表 - 正确的方法?

时间:2014-03-29 21:13:06

标签: php mysql join query-optimization

我有一种情况,我有4个以下架构表:

#1 : Table USER
user_id | user_details....

#2 : Table POSTS
post_id | user_id | post_details....

#3 : Table REPLIES
reply_id | post_id | by_user_id | reply_details...

#4 : Tables REPLY_PHOTOS
photo_id | reply_id | photo_details...

我想检索特定用户的所有帖子以及回复中的回复和回复中的照片。上表中列的每次使用都在外键约束中。

SELECT USER.user_id, POST.post_id, REPLIES.reply_id, REPLY_PHOTOS.photo_id
FROM USER WHERE USER.user_id = 1
LEFT JOIN POST on USER.user_id = POST.user_id
LEFT JOIN REPLIES on POST.post_id = REPLIES.post_id
LEFT JOIN REPLY_PHOTOS on REPLIES.reply_id = REPLY_PHOTOS.reply_id;

我面临的问题是,当我正在使用连接时,我正在获得行,我怀疑这不是一个好习惯。

我为user_id = 1获得的结果示例:

user_id | post_id | reply_id | photo_id
--------Post 1 - Reply 1 (Repeat for photos)----------------
   1         23        17         26
   1         23        17         32
   1         23        17         47
-------Post 1 - Reply 2 (Repeat for its photos)-----------
   1         23        34         12
   1         23        34         18
   1         23        34         23
   1         23        34         31
------Post 1 - Reply 3 (Contains no photos)------------
   1         23        41         null
---------Next Post for same user (contd.)----------------

由于用户可以拥有多个帖子,因此多个post_id与单个用户ID相关。 帖子可以包含多个回复,因此多个reply_id与单个帖子相关。 回复可以包含多张照片,因此多个photo_id与单个回复相关。

此外,我想进一步扩展它以存储喜欢,这将是另一个痛苦的屁股。

我不知道我的架构是否需要更改(如果是,建议我采用更好的方式),或者我是否无法理解加入的基础知识。

如果这是结果的方式,那么如何在没有太多问题的情况下遍历php中的所有字段?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

大多数时候,我很乐意处理返回行的重复部分,忽略它们。但是在这种情况下,您可以使用GROUP_CONCAT。

这样的事情: -

SELECT USER.user_id, POST.post_id, GROUP_CONCAT(CONCAT_WS('~',REPLIES.reply_id, REPLY_PHOTOS.photo_id)) AS ReplyPhotoId
FROM USER WHERE USER.user_id = 1
LEFT JOIN POST on USER.user_id = POST.user_id
LEFT JOIN REPLIES on POST.post_id = REPLIES.post_id
LEFT JOIN REPLY_PHOTOS on REPLIES.reply_id = REPLY_PHOTOS.reply_id
GROUP BY USER.user_id, POST.post_id

然后你可以爆炸出ReplyPhotoId字段(默认情况下在逗号上),并且对于结果数组的每个元素,再次基于〜来爆炸它。