我正在尝试创建一个简单的分页,但它似乎没有达到limit
结果的数量。
SELECT * FROM visits GROUP by clientID ORDER BY 'date' LIMIT $from, $to
我只想获得每个客户的第一次访问(按时间顺序)并对结果进行分页。
如果我使用 $from = 6, $to = 12 进行此查询,它将返回 8 行而不是 7 行。
我做错了什么?
来自 MySQL 的 docs onLIMIT
子句
LIMIT 子句可用于限制 SELECT 语句返回的行数。LIMIT 接受一个或两个数字参数,它们都必须是非负整数常量(使用准备好的语句时除外)。
有两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行的偏移量为 0(不是 1)。
当您选择$from
6 和$to
12 时;您没有从 6 到 12 进行选择;您将选择12 行,从$from + 1
= 7 开始。
LIMIT 子句的第一个参数是起始偏移量,第二个参数是要返回的行数。因此,您的查询应该是:
... LIMIT $from, ($to - $from)
使用您使用的 dbms 和语法,限制表达式中的第二个数字是允许的结果数,而不是偏移端点。因此,您从 6 开始并允许接下来的 12 个结果,而不是获得 6-12 的结果。
如果要获得结果 6-12,请使用limit 5,7
您的查询不会按日期返回第一次访问。为此,您需要实际加入以下信息:
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
子句中且不是聚合函数参数的列。