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