我有一种情况,我有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
中的所有字段?
提前谢谢。
答案 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字段(默认情况下在逗号上),并且对于结果数组的每个元素,再次基于〜来爆炸它。