我有一个查询,可以获取帖子和帖子,其中包含他所关注的用户和用户的照片。这是下面的查询。
$query = "SELECT Posts.*, Profiles.ProfilePhoto, Users.Name, Users.Username, Post_Photos.Photo
FROM (((Posts
INNER JOIN Profiles ON Posts.UserID = Profiles.UserID)
INNER JOIN Users ON Posts.UserID = Users.ID)
INNER JOIN Post_Photos ON Posts.ID = Post_Photos.PostID)
WHERE (Posts.UserID = ? OR Posts.UserID in (SELECT Followed FROM Follow WHERE Follower = ?))
GROUP BY PostID
ORDER BY Posts.CreateDate DESC";
这个查询将编译,虽然它得到我需要的结果有一些错误。
首先,对于此查询,它将仅返回Post_Photos.Photos为真的结果。因此,没有照片的帖子不会被退回。我玩过GROUP BY认为可行,但我无法解决任何问题。有没有我遗失的东西仍然可以从帖子表中返回结果而没有Post_Photos中的值?
第二个问题是,如果我的Post_Photos表中有多张照片分配给postID,则会为每张照片创建一个帖子。为了解决这个问题,我在我的查询中添加了一个GROUP BY PostID,但只显示了一个图像。
$photo = $row['Photo']; // getting photo from table
我玩了一个foreach,然后循环使用$ row [' Photo']并尝试制作一个数组,但我无法让他们返回照片,然后将它们打印到我的$ output 。关于如何在我的查询中修复问题的任何线索,或者是否有更合适的方法来获取这些数据将非常有用!
答案 0 :(得分:1)
要解决第一个问题,您需要将Post_Photos上的INNER JOIN
更改为LEFT JOIN
。这将确保在Post_Photos
中没有与PostID
匹配的条目时仍然可以返回结果,即
LEFT JOIN Post_Photos ON Posts.ID = Post_Photos.PostID)
如果Post_Photos.Photo
是一个字符串(代表照片的名称或文件名),您可以通过将您的选择中的Post_Photos.Photo
更改为GROUP_CONCAT(Post_Photos.Photo)
来解决您的第二个问题,即
SELECT Posts.*, Profiles.ProfilePhoto, Users.Name, Users.Username, GROUP_CONCAT(Post_Photos.Photo) AS Photo
然后在PHP中你可以这样做:
$photos = explode(',', $row['Photo']);