检索下15个mysql字段,即使它们的ID不是顺序的

时间:2013-03-15 19:44:43

标签: php mysql sql limit

我不确定如何标题这个问题,因为它有点难以理解;

我有一个存储博客帖子的数据库表,我正在使用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按降序排列

2 个答案:

答案 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下面,这就是所有博客。