我的数据库表中有超过 500 行具有特定日期。
查询具有特定日期的行。
select * from msgtable where cdate='18/07/2012'
这将返回 500 行。
如何逐步查询这 500 行 10 行。查询前 10 行并在浏览器中显示,然后查询后 10 行并在浏览器中显示?
我的数据库表中有超过 500 行具有特定日期。
查询具有特定日期的行。
select * from msgtable where cdate='18/07/2012'
这将返回 500 行。
如何逐步查询这 500 行 10 行。查询前 10 行并在浏览器中显示,然后查询后 10 行并在浏览器中显示?
只需使用该LIMIT
子句。
SELECT * FROM `msgtable` WHERE `cdate`='18/07/2012' LIMIT 10
从下一个电话开始,您可以这样做:
SELECT * FROM `msgtable` WHERE `cdate`='18/07/2012' LIMIT 10 OFFSET 10
关于OFFSET
和的更多信息。LIMIT
LIMIT
OFFSET
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),无论您的区域设置如何,它都有效。
如果在相关列中插入、删除或更改涉及的行,分页仍将发生变化。它必须。
为了避免这种转变或使用大表获得更好的性能,请使用更智能的分页策略:
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
<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>
对于前 10 行...
SELECT * FROM msgtable WHERE cdate='18/07/2012' LIMIT 0,10
接下来的 10 行
SELECT * FROM msgtable WHERE cdate='18/07/2012' LIMIT 10,10
您可以使用postgresql 游标
BEGIN;
DECLARE C CURSOR FOR where * FROM msgtable where cdate='18/07/2012';
然后使用
FETCH 10 FROM C;
获取 10 行。
芬兰语
COMMIT;
关闭光标。
但是,如果您需要在不同的进程中进行查询,@Praveen Kumar 建议的 LIMIT 和 OFFSET 会更好
行。所以我认为你只需要实现分页。
$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