RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 765932
Accepted
splash58
splash58
Asked:2020-01-03 05:13:14 +0000 UTC2020-01-03 05:13:14 +0000 UTC 2020-01-03 05:13:14 +0000 UTC

一次请求按 OFFSET 获取记录,记录数最多

  • 772

有一个出版物表,它显示在页面上,查询如下

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。是否有可能以某种方式欺骗他,或者您必须提出两个要求?

mysql
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Visman
    2020-01-03T08:09:53Z2020-01-03T08:09:53Z

    这是发生的事情:

    SET @var1:=0;
    SELECT r.nrow, p.*
    FROM `posts` AS p
    JOIN (
        SELECT IF(posted < 1203781710, @var1:=@var1+1, @var1) AS nrow, id
        FROM `posts`
    ) AS r ON r.id=p.id
    WHERE (25*FLOOR(@var1/25))<r.nrow
    ORDER BY id
    LIMIT 25
    

    我在我的数据库上测试了查询,所以表和列的名称是我的。 @var1在创建时间小于条件中指定的情况下计算表行数IF(posted < 1203781710, @var1:=@var1+1, @var1)。在最终的选择中,我们只取最后一个条目的页面中的行,其中posted < 1203781710-> 是(25*FLOOR(@var1/25))<r.nrow这个页面上第一个条目的计算(可能有 + -1 条目的不准确!你需要用检查来测试) .

    UPD更改排序和页面计算公式

    SET @var1:=0;
    SELECT r.nrow, p.*
    FROM  t1 AS p
    JOIN (
        SELECT IF(pub >= '2017-12-01', @var1:=@var1+1, @var1) AS nrow, id
        FROM t1
        ORDER BY pub DESC
    ) AS r ON r.id=p.id
    WHERE (3*(CEILING(@var1/3)-1))<r.nrow
    ORDER BY pub DESC
    LIMIT 3;
    

    http://sqlfiddle.com/#!9/95f3e9/72

    • 1
  2. Best Answer
    Mike
    2020-01-03T17:50:41Z2020-01-03T17:50:41Z

    你不能在有限的范围内替代任何东西。您只能通过动态查询来解决此限制,例如此处。

    鉴于您不仅需要选择数据,还需要向客户显示他在第 30 页(以便他可以在按日期定位后转到 29 或 31)。尽管如此,我建议使用单独的请求来执行此操作,首先计算页码,然后根据这个数字以通常的方式进行选择。

    但是如果你仍然想要一个请求,那么你可以尝试这样的事情:

    select *
      from mytable,
           ( select max(pub_date) pub_date, max(id) id
               from (
                  select pub_date, id, @cnt:=@cnt+1 NR
                    from mytable, (select @cnt:=0) a
                   where pub_date>(@need_date:='2018-01-01')
                   order by pub_date
                   limit 25
               ) X
             where NR=(select count(1) % 25 from mytable where pub_date>'2018-01-01')
           ) Start
      where (mytable.pub_date<coalesce(Start.pub_date,@need_date) OR
             (mytable.pub_date=coalesce(Start.pub_date,@need_date) and mytable.id<=coalesce(Start.id,0) )
            )
     order by mytable.pub_date desc
     limit 0,25
    

    在这里,我们选择并编号一页中紧接在我们要查找的记录之前的记录。通过记录数,等于记录数除以页面大小(当前页面上您要查找的记录数之前的记录数)的余数,我们找出它的日期和id。如果页面上有多个帖子的日期完全相同,则会收到 id。因此,我们了解了我们需要的页面上第一个条目的日期和 ID,并且可以在通常的 where 子句中使用它们,偏移量为零。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5