通过一个 SQL 查询得到两个不同的结果

Getting two different results by one SQL query

首先我是 SQL 和 PHP 的新手。

我创建了一个简单的社交网络网络应用程序,因此用户可以 post 并关注其他人以查看他们的新 post。

在主页上,用户可以首先看到他关注的所有用户的 post。

但我想要的是让用户看到一些其他随机流行的 post 将按赞订购。

这里是我为从我关注的用户那里获得 post 所做的工作:

SELECT * FROM posts WHERE author_id in 
 (SELECT followedID FROM follows WHERE
 followerID=:myID)
 ORDER BY id DESC LIMIT 10

现在假设您只关注了 1 个人。而那个人只有一个post。在这里你只会看到一个 post!

这就是为什么我想在用户已经看到所有 post 时显示更多 post。

我想要一些简单的方法来获取其他 posts 当上面的查询完成了一些特定的 posts 时。

这是我要执行的下一个查询。

SELECT * FROM posts ORDER BY post_likes DESC LIMIT 10

你可以使用 UNION 做你想做的事

(SELECT * FROM posts WHERE author_id in 
 (SELECT followedID FROM follows WHERE
 followerID=:myID)
 ORDER BY id DESC limit 0,10) 
union
(SELECT * FROM posts ORDER BY post_likes DESC limit 0,10)
LIMIT 0, 10

  1. UNION会自动将第2条查询结果附加到第1条查询结果,然后只显示LIMIT子句指定的记录数
  2. 请注意,联合仅在查询具有相同结构(在本例中为正)时有效
  3. 请注意,如果您使用 order by 或 limit 或两者都使用,则必须使用括号
  4. 我使用了 3 个限制子句(一个用于每个查询,一个用于联合的最终结果)并且两个查询都有 ORDER BY 子句。这是为了确保提取的记录是您想要的。 (显示后续帖子第一个,并且两个帖子都按正确顺序排列)

我不推荐 union,因为它会产生删除重复项的开销。

相反,您可以使用 LEFT JOIN:

SELECT p.*
FROM posts p LEFT JOIN
     follows f
     ON p.author_id = f.follows_id AND
        f.followerID = :myID
ORDER BY (f.follows_id IS NOT NULL) DESC,
         (CASE WHEN f.follows_id IS NOT NULL THEN p.id END),
         p.post_likes DESC
LIMIT 10;

ORDER BY 将关注的帖子放在第一位。其他两个子句按您想要的标准对每个组进行排序。