2013-02-25 131 views
4

我正在尝试创建一个简单的分页,但它似乎无法获得结果的数目limitSQL限制组的数量

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

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

如果我就与这个$查询从= 6,$为= 12返回像8行,而不是7

我做错了什么?

+3

如果列出DBMS和版本,它可能会有所帮助。 – 2013-02-25 21:32:33

+0

MySQL ver 5.5.24 – Cristy 2013-02-25 21:33:13

回答

6

从MySQL的文档上LIMIT条款

LIMIT子句可以被用来限制SELECT语句返回的行数。 LIMIT需要一个或两个数字参数,它们都必须是非负整数常量(除了使用预准备语句时)。

随着两个参数,第一个参数指定的第一行的偏移量返回,并且秒指定行的最大数目返回。初始行的偏移量是0(不是1)。

当您选择$from为6和$to为12;你没有选择从6到12;你会选择行,从$from + 1 = 7

+0

我的整个生活都是一个谎言:( – Cristy 2013-02-25 21:43:11

+0

@Cristy今天我有一个类似的经历,但积分虽然!:P – hjpotter92 2013-02-25 21:43:53

2

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

... LIMIT $from, ($to - $from) 
2

与DBMS和你正在使用的语法,在限制言论自由的第二个数字是允许的,不能抵消终点结果的数量。所以你从6开始,允许接下来的12个结果,而不是6-12的结果。

如果你想要得到的结果6-12,使用limit 5,7

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(错误)功能,您可以在select子句中包含不在group by子句中的列,而不是聚合函数的参数。

+0

哦,但它似乎工作正常。 – Cristy 2013-02-25 22:04:41