我正在尝试创建一个简单的分页,但它似乎无法获得结果的数目limit
。SQL限制组的数量
SELECT * FROM visits GROUP by clientID ORDER BY 'date' LIMIT $from, $to
我只想得到每个客户端的第一次访问(按时间顺序),并对结果进行分页。
如果我就与这个$查询从= 6,$为= 12返回像8行,而不是7
我做错了什么?
我正在尝试创建一个简单的分页,但它似乎无法获得结果的数目limit
。SQL限制组的数量
SELECT * FROM visits GROUP by clientID ORDER BY 'date' LIMIT $from, $to
我只想得到每个客户端的第一次访问(按时间顺序),并对结果进行分页。
如果我就与这个$查询从= 6,$为= 12返回像8行,而不是7
我做错了什么?
从MySQL的文档上LIMIT
条款
LIMIT子句可以被用来限制SELECT语句返回的行数。 LIMIT需要一个或两个数字参数,它们都必须是非负整数常量(除了使用预准备语句时)。
随着两个参数,第一个参数指定的第一行的偏移量返回,并且秒指定行的最大数目返回。初始行的偏移量是0(不是1)。
当您选择$from
为6和$to
为12;你没有选择从6到12;你会选择行,从$from + 1
= 7
我的整个生活都是一个谎言:( – Cristy 2013-02-25 21:43:11
@Cristy今天我有一个类似的经历,但积分虽然!:P – hjpotter92 2013-02-25 21:43:53
LIMIT cluase的第一个参数是起始偏移量,第二个参数是要返回的行数。 因此您的查询应该是:
... 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(错误)功能,您可以在select
子句中包含不在group by
子句中的列,而不是聚合函数的参数。
哦,但它似乎工作正常。 – Cristy 2013-02-25 22:04:41
如果列出DBMS和版本,它可能会有所帮助。 – 2013-02-25 21:32:33
MySQL ver 5.5.24 – Cristy 2013-02-25 21:33:13