用于获取多张照片的SQL语句

时间:2018-04-01 01:44:56

标签: php sql

我有一个查询,可以获取帖子和帖子,其中包含他所关注的用户和用户的照片。这是下面的查询。

$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 。关于如何在我的查询中修复问题的任何线索,或者是否有更合适的方法来获取这些数据将非常有用!

1 个答案:

答案 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']);