我正在尝试制作一个脚本,显示我朋友和我的最新帖子。 有3个与此相关的表 - statusUpdates(包含帖子),朋友(使用ID的朋友之间的链接)和用户(包含网站所有用户的详细信息)。 我目前使用的脚本如下。
$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是我自己的身份证。
问题是,当我没有朋友时,即使我已经进行了多次状态更新,也没有出现任何帖子。
解决方案是在friends表中创建一行,将我添加为我自己的朋友。 但在这种情况下,我将不得不在“显示朋友列表”页面以及任何其他相关页面中阻止我自己的名字出现。
我最初使用INNER JOIN
并遇到上述问题。然后我来了similar issue,并根据建议使用LEFT JOIN
修改了我的脚本。它似乎已经解决了该职位OP的问题,但不是我的。
我不能在那篇文章中提交评论(可能是因为它已有2年了)。所以我正在创建这篇文章。
答案 0 :(得分:3)
更新:我没有考虑到你也想要你朋友的帖子。
虽然您已经将答案标记为正确,但由于IN
语句通常比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
INITIAL ANSWER:
只需更改where条件:
WHERE (fr.frHostID = 105090)
到
WHERE (su.authorID = 105090)
原因是你在左连接的右边部分放置了一个where条件,所以你强迫朋友存在。
顺便说一句,请关注这两个帖子:Why shouldn't I use mysql_* functions in PHP?
和
答案 1 :(得分: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
答案 2 :(得分:0)
尝试此查询
SELECT * FROM statusUpdates
WHERE autherID in (select frContactID from friends where frHostID = 105090)
or authorID = 105090
LIMIT 0,5