【问题标题】:Is Offset should specify at the end of Sql query?Offset 是否应该在 Sql 查询的末尾指定?
【发布时间】:2017-02-24 18:28:58
【问题描述】:
  1. SELECT * CUSTOMERS LIMIT 5 偏移量 0。

假设 CUSTOMERS 是详细信息表。上面的查询工作正常,但如果我指定查询结束以外的偏移量,我会出错。

  1. 创建了一个包含以下详细信息的表。

表名是 sms_view

查询:

SELECT SMS FROM sms_view WHERE read=2 LIMIT 5 OFFSET 0;

结果是

上述结果是预期的,它基于读取值。因此,表是根据读取值、偏移量和应用于创建的表的限制创建的。所以结果如上所示。

但我的要求是,偏移量和限制应该应用于整个表,读取值应该应用于创建的表。

预期结果是:

我需要查询预期结果。

【问题讨论】:

  • 您还想把它放在哪里? OFFSETLIMIT 子句的一部分,它位于查询的末尾。顺便说一句,如果没有 ORDER BY 子句,它几乎没有任何意义。
  • 而且缺少FROM,所以我们对'fine'有不同的定义

标签: mysql sql


【解决方案1】:

是的,应该放在最后。见https://dev.mysql.com/doc/refman/5.7/en/select.html

SELECT * FROM CUSTOMERS 
ORDER BY somecolumn  -- important to get consistent results
LIMIT 5 OFFSET 0

做同样事情的另一种方法是:

SELECT * FROM CUSTOMERS 
ORDER BY somecolumn
LIMIT 0, 5

或者在这种情况下(因为偏移量为 0):

SELECT * FROM CUSTOMERS 
ORDER BY somecolumn
LIMIT 5

【讨论】:

    【解决方案2】:
    MariaDB [sandbox]> Drop table if exists sms_view;
    Query OK, 0 rows affected (0.10 sec)
    
    MariaDB [sandbox]> create table sms_view(SMS int,db_id int, `read`  int);
    Query OK, 0 rows affected (0.28 sec)
    
    MariaDB [sandbox]> insert into sms_view values
        -> (1, 2, 3) ,
        -> (2, 2, 3),
        -> (3, 2, 2) ,
        -> (4, 2, 2) ,
        -> (5, 2, 2) ,
        -> (6, 2, 2) ,
        -> (7, 2, 2) ,
        -> (8, 2, 2) ,
        -> (9, 2, 2) ,
        -> (10, 2, 2);
    Query OK, 10 rows affected (0.04 sec)
    Records: 10  Duplicates: 0  Warnings: 0
    
    MariaDB [sandbox]>
    MariaDB [sandbox]> select sms from
        -> (
        -> SELECT * FROM sms_view LIMIT 5 OFFSET 0
        -> ) s
        ->  WHERE `read` = 2;
    +------+
    | sms  |
    +------+
    |    3 |
    |    4 |
    |    5 |
    +------+
    3 rows in set (0.00 sec)
    

    【讨论】:

    • - P.Salmon,提供的解决方案特定于预期结果场景。有没有办法获得通用解决方案
    • 以什么方式通用?
    • 我有一个 sql 查询,例如 (SELECT * FROM table name WHERE filter criteria (read=2) ORDER BY column name) 并应用 LIMIT OFFSET 值。完整的 sql 查询是 (SELECT * FROM table name WHERE filter criteria (read=2) ORDER BY column name LIMIT value OFFSET value) 限制和 OFFSET 值适用于 sql 查询(表是使用 sql 查询创建的),如果我有 LIMIT 和 OFFSET。
    • 听起来你想通过传递一堆参数(表名、列列表、where语句、限制、偏移量)来生成一个sql语句——你为什么要这样做似乎并不值得我费心,因为参数列表几乎就是 sql 语句。
    猜你喜欢
    • 2019-02-20
    • 2021-12-13
    • 2014-01-06
    • 1970-01-01
    • 2020-10-30
    • 2020-04-29
    • 2011-03-26
    • 2012-08-26
    • 1970-01-01
    相关资源
    最近更新 更多