我不确定如何标题这个问题,因为它有点难以理解;
我有一个存储博客帖子的数据库表,我正在使用AJAX在页面上创建这些博客文章的无限滚动。最初,在访问该页面时,会显示10个最新的博客。
我正在使用$start
和$limit
变量进行MySQL查询,因此它知道从哪个博客开始抓取,然后从数据库中抓取多少。我的问题是因为删除博客我的ID不是按顺序排列的,所以我不能只做一个标准的SELECT * FROM blogs ORDER BY blog_id DESC LIMIT $start, $limit
。
现在我正在做SELECT * FROM blogs WHERE blog_id <= $start ORDER BY blog_id DESC LIMIT $limit
,它会返回所有博客,但它会为数据库中的最后一个博客创建一个无限循环。如果我从=
中移除<=
,那么它就不会有无限循环,但会跳过最新的博客。
如何在SQL语句中使用$start
和$limit
子句从数据库中获取所有博客,包括最近的子句,而不会导致无限循环?
编辑:以下是执行查询的JavaScript代码:
var loading = false;
$(window).scroll(function(){
var h = $('.post-container').height();
var st = $(window).scrollTop();
if(st >= 0.6*h && !loading && h > 400){
loading = true;
$('#ajaxLoader').show();
$.ajax({
url: "/ajax/blog.process.php?lastid=" + $(".post:last").attr("id"),
success: function(html){
if(html){
$(".post-container").append(html);
$('div#ajaxLoader').hide();
}else{
$('div#ajaxLoader').html('<center>No more posts to show.</center>');
}
loading = false;
}
});
}
});
编辑x2:
如果我切换$start
和$limit
这样的LIMIT $limit,$start
变量,那么我就会开始得到结果,但它们是最早的结果......我希望获得最新的结果ID按降序排列
答案 0 :(得分:0)
如果MySQL中有分析函数,那么您可以使用ROW_NUMBER()
对具有非顺序ID的行进行排序。然后在where子句中使用行号。
这是使用ROW_NUMBER()
:
SELECT * FROM
(
SELECT empno, deptno, ename, sal
, ROW_NUMBER() OVER (ORDER BY ename) Row_Seq
FROM scott.emp
)
WHERE row_seq BETWEEN 1 AND 3
/
EMPNO DEPTNO ENAME SAL ROW_NUM
--------------------------------------------
7876 20 ADAMS 1100 1
7499 30 ALLEN 1600 2
7698 30 BLAKE 2850 3
答案 1 :(得分:0)
所以我无法找出LIMIT $start, $limit
无效的原因,但我能够通过使用此函数来解决这个问题:
public function getLastBlogId() {
$sql = $this->mysqli->query("SELECT * FROM blogs ORDER BY blog_id DESC LIMIT 1");
$row = $sql->fetch_assoc();
$num = $this->mysqli->real_escape_string(intval($row['blog_id']));
$num = $num + 1;
return $num;
}
要获取表格中最高的博客ID,然后为其添加+1,这样我就不必在查询中使用<=
。 =
符号是导致无限循环的部分,我需要它包含最新的博客。因此,为最高博客ID添加+1会使每个博客都在该ID下面,这就是所有博客。