如何查询前10行,下次查询表中的其他10行

时间:2012-09-18 13:26:46

标签: sql postgresql

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

查询具有特定日期的行。

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

这会返回500行。

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

7 个答案:

答案 0 :(得分:53)

只需使用LIMIT子句。

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

从下次通话中你可以这样做:

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

有关LIMIT and OFFSETOFFSETLIMIT的更多信息。

答案 1 :(得分:11)

LIMIT limit OFFSET offset将有效。

但是你需要一个稳定的ORDER 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 in my example),无论您的语言环境设置如何,都可以使用。

如果在相关列中插入或删除或更改了相关行,则分页仍将移位。它必须。

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

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:1)

.disabled{
     pointer-events: none;
     opacity: 0.5;
}

答案 5 :(得分:0)

您可以使用postgresql Cursors

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

然后使用

FETCH 10 FROM C;

获取10行。

芬兰语

COMMIT;

关闭光标。

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

答案 6 :(得分: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