【发布时间】:2021-09-23 18:14:41
【问题描述】:
为了让我的查询更快,我根据设置为起始值的主键idpaginate,即posts.id > $start。
这就是我获取常规帖子的方式,即在下一个查询请求中按顺序获取 id
// start value
$start = $_GET['start'];
if ($start <= 0) {
// set as first request
$offSet = "AND posts.id > $start";
}
else if ($start > 0) {
// set as subsequent request
$offSet = "AND posts.id < $start";
}
// fetch posts
$posts = $db->query("SELECT posts.id, posts.likes,
posts.dislikes, posts.comments
FROM posts, users
WHERE posts.user_id=users.id
$offSet
ORDER BY posts.id DESC LIMIT 0, 15");
这是我获取最喜欢的帖子的方式
// fetch posts
$posts = $db->query("SELECT posts.id, posts.likes,
posts.dislikes, posts.comments
FROM posts, users
WHERE posts.user_id=users.id
$offSet
AND posts.likes != 0
ORDER BY posts.likes DESC LIMIT 0, 15");
问题是如果我ORDER BY likes DESC,id 将不是连续的,因此如果我请求更多帖子,结果将重复第一组结果。
谁能帮我写一个查询来获取帖子和ORDER BY posts.likes DESC,并且仍然允许我根据id对查询进行分页,这样后续请求就不会逐渐变慢(因为mysql经历了所有前几行)
这是由@RickJames 提供的实现
$start = $leftoff_likes = 0;
// fetch most liked posts
$posts = $db->query("
SELECT posts.id, posts.body, posts.user_id, posts.tag, posts.date, posts.comments, posts.likes, posts.dislikes, users.name, users.image
FROM posts, users
WHERE posts.likes <= $leftoff_likes
AND ( posts.likes < $leftoff_likes OR posts.id < $start )
AND posts.user_id=users.id
ORDER BY posts.likes DESC, posts.id DESC
LIMIT 0, 15");
echo json_encode($posts);
【问题讨论】:
-
使用 INNER JOIN 代替逗号
-
你是什么意思
-
代替
FROM a,b WHERE a.x=b.x,使用FROM a JOIN b ON a.x=b.x。它们具有相同的效果;后者是“现代”语法。 -
是的,谢谢@RickJames,效果很好!