通过一个 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
- UNION会自动将第2条查询结果附加到第1条查询结果,然后只显示LIMIT子句指定的记录数
- 请注意,联合仅在查询具有相同结构(在本例中为正)时有效
- 请注意,如果您使用 order by 或 limit 或两者都使用,则必须使用括号
- 我使用了 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
将关注的帖子放在第一位。其他两个子句按您想要的标准对每个组进行排序。
首先我是 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
- UNION会自动将第2条查询结果附加到第1条查询结果,然后只显示LIMIT子句指定的记录数
- 请注意,联合仅在查询具有相同结构(在本例中为正)时有效
- 请注意,如果您使用 order by 或 limit 或两者都使用,则必须使用括号
- 我使用了 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
将关注的帖子放在第一位。其他两个子句按您想要的标准对每个组进行排序。