如何为非序列自动增量列创建下一个和上一个

时间:2017-09-08 22:54:52

标签: php mysqli

我有表包含许多列(content_id,content_type,.. so on)。 我使用了允许我根据content_type和content_id移动到下一行和上一行的代码。

但我想改进代码,以便能够移动到下一行,其id不与其他内容一致

示例:

在下表中我想实现Next和Previous链接,它将允许通过单击下一个和上一个链接来导航Video的所有content_type(1 - 2 - 5 - 7)

--------------------------------------------
content_id   content_type    content_name 
-----------------------------------------
   1            Video           A       
-----------------------------------------
   2            Video           B       
-----------------------------------------
   3            Audio           C       
-----------------------------------------
   4            Audio           D       
-----------------------------------------
   5            Video           E       
-----------------------------------------
   6            Audio           F       
-----------------------------------------
   7            Video           G       
----------------------------------------- 
    $nextQuery = "SELECT * FROM contents WHERE content_type ='Video' && content_id = 1 + " .$id."  LIMIT 1 ";
    $nextResult = mysqli_query($conn,$nextQuery);
    $nextRow = mysqli_num_rows($nextResult);

    if($nextRow == 0){

        $next = "<a href='#' >Next</a>";
        print_r($nextRow);

    }else{

        $fetchNext = mysqli_fetch_array($nextResult);
        print_r($fetchNext);
        print_r($nextRow);
        $next = "<a href='../services_tools/Watch.php?content_id=". $fetchNext['content_id']."' >Next</a>";

    }

    $prevQuery = "SELECT content_id FROM contents WHERE content_type ='Video' && content_id =".$id." -1  LIMIT 1";
    $prevResult = mysqli_query($conn,$prevQuery);
    $prevRow = mysqli_num_rows($prevResult);

    if($prevRow == 0){

        $pre = "<a href='#' >Pre</a>";

    }else{

        $fetchPre = mysqli_fetch_array($prevResult);

        $pre = "<a href='../services_tools/Watch.php?content_id=".$fetchPre['content_id']."' >Pre</a>";

    }

2 个答案:

答案 0 :(得分:1)

要查找下一个结果,请尝试在 之后获取所有查询,然后再将其限制为:

SELECT * FROM contents WHERE content_type='Video' && content_id > $id ORDER BY content_id ASC LIMIT 1

为了找到以前的结果,你可以做类似的事情,除了小于号(<)。这将获得id之前的所有结果,但它们的顺序错误。例如,如果您的身份证明是4,那么您将获得1,因为它将按照123的顺序排列(如果我们没有LIMIT)。因此,我们需要撤消结果,我们可以通过在ORDER BY content_id DESC语句之前添加LIMIT来执行此操作:

SELECT * FROM contents WHERE content_type='Video' && content_id < $id ORDER BY content_id DESC LIMIT 1

即使结果不是连续的,这也是有效的,首先出现的结果总是小于之后出现的结果。

另外,请注意,如果您事先没有对$id进行清理,那么您将面临SQL Injection的风险。查看Prepared Statements,或至少mysqli_real_escape_string

答案 1 :(得分:0)

当我理解你是正确的时,你只想让下一个(上一个)content_id具有相同的content_type

为此你只需要获取所有更大的id,命令它们升序并取第一个。这在一个sql语句中都是可能的,你的接近这个:

SELECT * FROM contents WHERE content_type ='Video' AND content_id > ".$id." ORDER BY content_id ASC LIMIT 1

对于之前你拿走所有较小的一个并按顺序排序

SELECT * FROM contents WHERE content_type ='Video' AND content_id < ".$id." ORDER BY content_id DESC LIMIT 1

结果将包含next / prev元素,如果是结尾或第一个,则为null。

作为旁注,请更好地使用准备好的陈述!