5

我正在尝试创建一个简单的分页,但它似乎没有达到limit结果的数量。

SELECT * FROM visits GROUP by clientID ORDER BY 'date' LIMIT $from, $to

我只想获得每个客户的第一次访问(按时间顺序)并对结果进行分页。

如果我使用 $from = 6, $to = 12 进行此查询,它将返回 8 行而不是 7 行。

我做错了什么?

4

4 回答 4

6

来自 MySQL 的 docs onLIMIT子句

LIMIT 子句可用于限制 SELECT 语句返回的行数。LIMIT 接受一个或两个数字参数,它们都必须是非负整数常量(使用准备好的语句时除外)。

有两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行的偏移量为 0(不是 1)。

当您选择$from6 和$to12 时;您没有从 6 到 12 进行选择;您将选择12 行,从$from + 1= 7 开始。

于 2013-02-25T21:39:47.953 回答
2

LIMIT 子句的第一个参数是起始偏移量,第二个参数是要返回的行数。因此,您的查询应该是:

... LIMIT $from, ($to - $from)
于 2013-02-25T21:35:36.357 回答
2

使用您使用的 dbms 和语法,限制表达式中的第二个数字是允许的结果数,而不是偏移端点。因此,您从 6 开始并允许接下来的 12 个结果,而不是获得 6-12 的结果。

如果要获得结果 6-12,请使用limit 5,7

于 2013-02-25T21:35:40.797 回答
1

您的查询不会日期返回第一次访问。为此,您需要实际加入以下信息:

select v.*
from visits v join
     (select clientid, MIN(date) as mindate
      from visits
      group by clientid
     ) vd
     on v.clientid = vd.clientid and v.date = vd.date
order by clientid
limit $from - 1, $to - $from

您最初的查询返回关于给定客户端的任意列集。这些列甚至不能保证来自同一记录。这是因为您使用的是 MySQL (mis) 功能,您可以在select子句中包含不在group by子句中且不是聚合函数参数的列。

于 2013-02-25T21:44:13.363 回答