【问题标题】:mysql - offset problemmysql - 偏移问题
【发布时间】:2010-06-17 07:21:19
【问题描述】:

我最近发布了一个关于以正确顺序在表格中获取最后 3 个结果的问题。我现在希望以正确的顺序获取除最后 3 个之外的所有 cmets。

这是我的语法;

SELECT *
FROM (SELECT * 
      FROM $table 
      ORDER BY ID DESC 
      OFFSET 3) AS T 
ORDER BY TIME_STAMP

我收到的错误是:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“OFFSET, 3) AS T ORDER BY TIME_STAMP”附近使用正确的语法

我似乎无法让它工作。非常感谢任何帮助。

【问题讨论】:

    标签: mysql syntax offset


    【解决方案1】:

    根据MySQL Documentation

    从某个特定位置检索所有行 偏移到结果的末尾 设置,你可以使用一些大的数字 第二个参数。这个说法 从第 96 行检索所有行 到最后:

    他们建议您使用如下查询:

    SELECT * FROM tbl LIMIT 95,18446744073709551615;
    

    所以在你的情况下,你应该尝试:

    SELECT *
    FROM (SELECT * 
          FROM $table 
          ORDER BY ID DESC 
          LIMIT 3,18446744073709551615) AS T 
    ORDER BY TIME_STAMP
    

    请注意,您也可以使用关键字OFFSET 使用 PostgreSQL 兼容版本:

    SELECT *
    FROM (SELECT * 
          FROM $table 
          ORDER BY ID DESC 
          LIMIT 18446744073709551615 OFFSET 3) AS T 
    ORDER BY TIME_STAMP
    

    以防万一,18446744073709551615 = 2^64 - 1

    【讨论】:

    • 我认为 OP 正在寻找相反的东西。获取除最后 3 条以外的所有记录。
    • @Daniel:这就是这个声明的作用。它跳过前 3 个并返回其余部分。
    • 实际上,只需将 DESC 替换为 ASC 即可,该查询可以执行任何您想要的操作 :)
    • @Nicholas:如果您颠倒排序,您需要知道要选择多少行,以免得到最后 3 行(即 count - 3)。
    • 我不得不将偏移量更改为 3 但完美。
    【解决方案2】:

    你不能在没有 LIMIT 的情况下使用 OFFSET。

    有点笨重,但该查询对我有用,如果没有冗余的内部子查询(mysql 5.0.90)就无法工作

    select * from $table 
    where id not in (
      select id from (
        select id from languages order by id DESC LIMIT 3
      ) l1
    ) order by time_stamp
    

    【讨论】:

      【解决方案3】:

      因为我复制了同样的问题:

      OFFSET :offset LIMIT :limit
      

      来自现有查询,在 Postgres 中有效。

      显然顺序在 MySQL 中很重要,所以颠倒顺序对我有用:

      LIMIT :limit OFFSET :offset 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-08
        • 1970-01-01
        相关资源
        最近更新 更多