【问题标题】:Getting two different results by one SQL query一个 SQL 查询得到两个不同的结果
【发布时间】:2021-11-13 01:55:38
【问题描述】:

首先我是 SQL 和 PHP 的新手。

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

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

但我想要的是让用户看到一些其他随机流行的帖子,这些帖子将按赞排序。

这是我为从我关注的用户那里获取帖子所做的工作:

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

现在假设您只关注 1 个人。而那个人只有一个职位。在这里你只会看到一个帖子!

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

当上述查询完成获取某些特定帖子时,我想要一些简单的方法来获取其他帖子。

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

SELECT * FROM posts ORDER BY post_likes DESC LIMIT 10

【问题讨论】:

  • 只需使用 UNION 来做你想做的事。
  • @Ken Lee UNION 会在第一个查询结束后执行第二个查询吗?
  • 在您的第二个查询中,为什么要使用两个 order by 子句。如果可能,请提供一些包含两个表和预期输出的示例数据。
  • 在下面查看我的答案
  • @Rahul 我误写了双 ORDER BY

标签: php mysql sql pdo


【解决方案1】:

你可以使用 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 会自动将第二个查询结果附加到第一个查询结果中,然后只显示 LIMIT 子句指定的记录数
  2. 请注意,仅当查询具有相同的结构(在这种情况下为正)时,联合才有效
  3. 请注意,如果您使用 order by 或 limit 或同时使用两者,则必须使用括号
  4. 我使用了 3 个限制子句(每个查询一个,一个用于联合的最终结果)并且两个查询都有 ORDER BY 子句。这是为了确保提取的记录是您想要的。 (显示后面的帖子首先,并且两者都正确排序)

【讨论】:

  • 是的,我已经尝试过了,它工作得很好,谢谢。这是我第一次使用 UNION ? 请删除其中一个 ORDER BY 因为我写错了两个
  • 我会进一步修改我的答案
  • 现在完美了❤
  • 不客气。请注意,如果您使用 order by 或 limit 或同时使用两者,则必须使用括号;并且我使用了 3 个限制子句(每个查询一个,一个用于联合的最终结果)来确保提取的记录是您想要的。
  • @JihaneElberouhi 。 . .我很惊讶你接受了这个答案。您的问题表明您希望 first 关注后续帖子,而此查询不会这样做。
【解决方案2】:

我不推荐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 将关注的帖子放在首位。其他两个子句按照您想要的标准对每个组进行排序。

【讨论】:

  • 我接受了你的回答。第一个答案是显示我首先关注但不订购其他帖子的人的帖子。您的代码可以正确完成我需要的所有操作。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多