有一个出版物表,它显示在页面上,查询如下
select * from table where <всякие_условия> order by pub_date desc limit off, lim
名单很长——几千。我想添加按月和按年定位的功能。即,例如,用户指向январь 2015并到达第30页。
但是在一个请求中
SELECT * FROM mytable
cross join (
select (@cnt := 25*ceil(count(*)/25)) cnt from mytable
where pub_date > '2015-01-01'
) tt
order by pub_date desc
limit <что бы сюда подставить>, 25
select...limit 如果包含, cnt,则抛出错误@cnt
MySQl 抱怨偏移量中的 cnt。是否有可能以某种方式欺骗他,或者您必须提出两个要求?
这是发生的事情:
我在我的数据库上测试了查询,所以表和列的名称是我的。
@var1在创建时间小于条件中指定的情况下计算表行数IF(posted < 1203781710, @var1:=@var1+1, @var1)。在最终的选择中,我们只取最后一个条目的页面中的行,其中posted < 1203781710-> 是(25*FLOOR(@var1/25))<r.nrow这个页面上第一个条目的计算(可能有 + -1 条目的不准确!你需要用检查来测试) .UPD更改排序和页面计算公式
http://sqlfiddle.com/#!9/95f3e9/72
你不能在有限的范围内替代任何东西。您只能通过动态查询来解决此限制,例如此处。
鉴于您不仅需要选择数据,还需要向客户显示他在第 30 页(以便他可以在按日期定位后转到 29 或 31)。尽管如此,我建议使用单独的请求来执行此操作,首先计算页码,然后根据这个数字以通常的方式进行选择。
但是如果你仍然想要一个请求,那么你可以尝试这样的事情:
在这里,我们选择并编号一页中紧接在我们要查找的记录之前的记录。通过记录数,等于记录数除以页面大小(当前页面上您要查找的记录数之前的记录数)的余数,我们找出它的日期和id。如果页面上有多个帖子的日期完全相同,则会收到 id。因此,我们了解了我们需要的页面上第一个条目的日期和 ID,并且可以在通常的 where 子句中使用它们,偏移量为零。