29

我的数据库表中有超过 500 行具有特定日期。

查询具有特定日期的行。

select * from msgtable where cdate='18/07/2012'

这将返回 500 行。

如何逐步查询这 500 行 10 行。查询前 10 行并在浏览器中显示,然后查询后 10 行并在浏览器中显示?

4

7 回答 7

66

只需使用该LIMIT子句。

SELECT * FROM `msgtable` WHERE `cdate`='18/07/2012' LIMIT 10

从下一个电话开始,您可以这样做:

SELECT * FROM `msgtable` WHERE `cdate`='18/07/2012' LIMIT 10 OFFSET 10

关于OFFSET更多信息。LIMITLIMITOFFSET

于 2012-09-18T13:29:01.717 回答
12

LIMIT limit OFFSET offset将工作。

但是您需要一个stableORDER BY子句,否则下一次调用的值可能会以不同的顺序排列(例如,在对表进行任何写入之后)。

SELECT *
FROM   msgtable
WHERE  cdate = '2012-07-18'
ORDER  BY msgtable_id  -- or whatever is stable 
LIMIT  10
OFFSET 50;  -- to skip to page 6

使用符合标准的日期样式(在我的示例中为 ISO 8601),无论您的区域设置如何,它都有效。

如果在相关列中插入、删除或更改涉及的行,分页仍将发生变化。它必须。

为了避免这种转变或使用大表获得更好的性能,请使用更智能的分页策略

于 2012-09-18T13:55:05.060 回答
2
SET @rownum = 0; 
SELECT sub.*, sub.rank as Rank
FROM
(
   SELECT *,  (@rownum := @rownum + 1) as rank
   FROM msgtable 
   WHERE cdate = '18/07/2012'
) sub
WHERE rank BETWEEN ((@PageNum - 1) * @PageSize + 1)
  AND (@PageNum * @PageSize)

每次传递参数@PageNum@PageSize获取所需的特定页面。例如,前 10 行将是@PageNum = 1 and @PageSize = 10

于 2012-09-18T13:30:00.233 回答
2
<html>
<head>
    <title>Pagination</title>
</head>
<body>
<?php 

    $conn = mysqli_connect('localhost','root','','northwind');
    $data_per_page = 10;
    $select = "SELECT * FROM `customers`";  
    $select_run = mysqli_query($conn, $select);
    $records = mysqli_num_rows($select_run);
    // while ($result = mysqli_fetch_array($select_run)) {      
    //     echo $result['CompanyName'] . '<br>';        
    // }
    // $records;
    echo "<br>";
    $no_of_page = ceil($records / $data_per_page);
    if(!isset($_GET['page'])){
        $page = 1;
    }else{
        $page = $_GET['page'];
    }
    $page_limit_data = ($page - 1) * 10;
    $select = "SELECT * FROM customers LIMIT " . $page_limit_data . ',' . $data_per_page ;
    $select_run = mysqli_query($conn, $select);
    while ($row_select = mysqli_fetch_array($select_run)){
        echo $row_select['CompanyName'] . '<br>' ;
    }
    for($page=1; $page<= $no_of_page; $page++){ 
        echo "<a href='pagination.php?page=$page'> $page" . ', ';   
    }
?>
<br>
<h1> Testing Limit Functions Here  </h1>
<?php 
$limit = "SELECT CompanyName From customers LIMIT 10 OFFSET 5";
$limit_run = mysqli_query($conn , $limit);
while($limit_result = mysqli_fetch_array($limit_run)){
    echo $limit_result['CompanyName'] . '<br>';
}
?>
</body>
</html>
于 2018-07-11T10:30:19.203 回答
1

对于前 10 行...

SELECT * FROM msgtable WHERE cdate='18/07/2012' LIMIT 0,10

接下来的 10 行

SELECT * FROM msgtable WHERE cdate='18/07/2012' LIMIT 10,10
于 2014-03-27T11:13:31.320 回答
0

您可以使用postgresql 游标

BEGIN;
DECLARE C CURSOR FOR where * FROM msgtable where cdate='18/07/2012';

然后使用

FETCH 10 FROM C;

获取 10 行。

芬兰语

COMMIT;

关闭光标。

但是,如果您需要在不同的进程中进行查询,@Praveen Kumar 建议的 LIMIT 和 OFFSET 会更好

于 2012-09-18T13:30:36.193 回答
0

行。所以我认为你只需要实现分页。

$perPage = 10;

$pageNo = $_GET['page'];

现在在数据库中查找总行数。

$totalRows = Get By applying sql query;

$pages = ceil($totalRows/$perPage);    

$offset = ($pageNo - 1) * $perPage + 1

$sql = "SELECT * FROM msgtable WHERE cdate='18/07/2012' LIMIT ".$offset." ,".$perPage
于 2017-05-23T08:42:13.347 回答