2

我正在尝试制作一个脚本,它将显示我和我的朋友的最新帖子。有 3 个表与此相关 - statusUpdates(包含帖子)、friends(使用 ID 的朋友之间的链接)和 users(包含网站所有用户的详细信息)。我目前使用的脚本如下。

$myQuery = mysql_query ("SELECT * FROM statusUpdates AS su 
             LEFT JOIN (friends AS fr) ON
                (fr.frHostID = su.authorID OR fr.frContactID = su.authorID) 
             WHERE (fr.frHostID = 105090)
             GROUP BY su.statusID
             ORDER BY su.statusID
             DESC LIMIT 0,5");

请注意,105090 是我自己的 ID。

问题是,当我没有朋友时,即使我进行了多次状态更新,也没有显示一条帖子。

一个解决方案是在朋友表中创建一行,将我添加为我自己的朋友。但在这种情况下,我必须防止我自己的名字出现在“显示好友列表”页面和任何其他相关页面中。

我最初使用INNER JOIN并遇到上述问题。然后我遇到了一个类似的问题,并LEFT JOIN按照建议修改了我的脚本。它似乎已经解决了该帖子的 OP 问题,但不是我的。我不能在那篇文章中提交评论(可能是因为它已经 2 岁了)。所以我正在创建这篇文章。

4

3 回答 3

3

更新:我没有考虑到你也想要你朋友的帖子。

尽管您已经将答案标记为正确,但由于该IN语句通常比 a 慢JOIN,您可以尝试以下操作:

SELECT * 
FROM statusUpdates AS su LEFT JOIN friends AS fr
ON fr.frContactID = su.authorID
WHERE (fr.frHostID = 105090 or su.authorID = 105090)
GROUP BY su.statusID
ORDER BY su.statusID
DESC LIMIT 0,5

初步答案:

只需更改 where 条件:

WHERE (fr.frHostID = 105090)

WHERE (su.authorID = 105090)

原因是您在左连接的右侧放置了 where 条件,因此您正在强制朋友的存在。

顺便说一句,请注意这两个帖子:

为什么我不应该在 PHP 中使用 mysql_* 函数?

如何防止 PHP 中的 SQL 注入?

于 2013-07-02T09:08:16.543 回答
1

请改用此查询:

SELECT * FROM statusUpdates AS su 
WHERE su.authorID = 105090 
OR su.authorID IN (
    SELECT fr.frContactID 
    FROM friends AS fr 
    WHERE fr.frHostID = 105090
)
GROUP BY su.statusID
ORDER BY su.statusID DESC 
LIMIT 0,5
于 2013-07-02T08:59:46.243 回答
0

试试这个查询

SELECT * FROM statusUpdates 
WHERE autherID in (select frContactID from friends where frHostID = 105090)
or authorID = 105090
LIMIT 0,5
于 2013-07-02T09:00:53.213 回答