用于连接包含多行的多个表的SQL查询——正确的方式


SQL Query for joining multiple tables containing multiple rows - The right way?

我有以下模式的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与一个回复相关。

另外,我想进一步扩展它来存储点赞,这将是另一个痛苦的屁股。

我不知道我的模式是否需要改变(如果是,建议我一个更好的方法),或者如果我不能理解join的基础知识。

如果这是结果应该的方式,那么我如何遍历php中的所有字段而没有太多问题?

提前感谢。

大多数情况下,我很乐意处理返回行的重复部分,忽略它们。但是,在这种情况下,您可以使用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字段(默认情况下在逗号上),并且对于结果数组的每个元素再次基于~.

展开。