【问题标题】:Selecting all records using SQL LIMIT and OFFSET query使用 SQL LIMIT 和 OFFSET 查询选择所有记录
【发布时间】:2013-04-03 18:30:50
【问题描述】:

不知有没有办法完成:

SELECT * FROM table

像这样使用LIMITOFFSET

SELECT * FROM table LIMIT all OFFSET 0

我可以编写 SQL 语句 使用 LIMIT 和 OFFSET 但仍然得到 ALL 结果吗?

* 当然我可以使用IF 声明,但如果可能的话我宁愿避免使用它

【问题讨论】:

  • 不想限制查询结果,为什么还要写LIMIT? LIMIT 的全部目的是(duh)限制结果的数量。
  • 非常简单:有时您只想编写涵盖所有不同场景的一行代码(或所需的最少行数)。
  • 示例:将参数作为 SQL 查询的 limit 值的脚本。有时你想运行 5 次,有时运行 50 次,有时运行一次。

标签: mysql sql database postgresql sqlite


【解决方案1】:

来自MySQL documentation

检索从某个偏移量到结果末尾的所有行 设置,您可以为第二个参数使用一些较大的数字。这 语句检索从第 96 行到最后一行的所有行:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

所以获取所有行可能如下所示:

SELECT * FROM tbl LIMIT 0,18446744073709551615;

【讨论】:

  • “一些很大的数字” - MySQL...可怕
  • 18446744073709551615 不仅仅是一个数字;这是 bigint 的最大值
  • 是的,我认为它会是某种东西,但他们真的应该说,而不是“一些大数字”......或者没有?
  • 我同意。像 MAX_INT_NUMBER 之类的东西,然后可能会根据系统处理器中的位数在未来发生变化。
  • PHP 会将包含 '18446744073709551615' 的变量转换为 FLOAT 类型,导致只检索 1 个结果。使用 PHP 7.3.12。
【解决方案2】:

这可能不是最好的方法,但它是第一个想到的......

SELECT * FROM myTable LIMIT 0,1000000

将 1000000 替换为某个足够大的数字,您知道该数字将始终大于表中的记录总数。

【讨论】:

  • 感谢您抽出宝贵的时间。
  • 这不是一个可靠的解决方案。
【解决方案3】:

我在 nodeJS 和 MySQL 中使用了这段代码,它运行良好,它可能会对你有所帮助。 你为什么用它?

  1. 它是可靠的,因为它是一个将附加查询的字符串。
  2. 如果要设置限制,则可以将限制与变量一起使用,否则将 0 与变量一起传递。

    var noOfGroupShow=0;  //0: all, rest according to number   
    if (noOfGroupShow == 0) {
        noOfGroupShow = '';
    } 
    else {
        noOfGroupShow = ' LIMIT 0, '+noOfGroupShow;
    }
    var sqlGetUser = "SELECT `user_name`,`first_name`,`last_name`,`image`,`latitude`, `longitude`,`phone`,`gender`,`country`,`status_message`,`dob` as user_date_of_birth FROM `tb_user` WHERE `user_id`=?"+noOfGroupShow;
    

【讨论】:

    【解决方案4】:

    是的,可以通过提供NULL:

    SELECT * FROM tab LIMIT NULL OFFSET NULL
    

    db<>fiddle PostgreSQL demo

    7.6. LIMIT and OFFSET

    LIMIT ALL 与省略 LIMIT 子句相同,LIMIT 带有 NULL 参数。


    Snowflake LIMIT / FETCH

    NULL空字符串 ('')$$$$ 也被接受并被视为 “无限”;如果在动态绑定参数到语句时收到不完整的参数列表,这主要对连接器和驱动程序(例如 JDBC 驱动程序)有用。

    SELECT * FROM demo1 ORDER BY i LIMIT NULL OFFSET NULL;
    
    SELECT * FROM demo1 ORDER BY i LIMIT '' OFFSET '';
    
    SELECT * FROM demo1 ORDER BY i LIMIT $$$$ OFFSET $$$$; 
    

    【讨论】:

      【解决方案5】:

      随着记录的增长,使用mysql_num_rows动态查找记录总数,而不是使用some large number

      $cektotalrec=mysql_query("SELECT * FROM TABLE");
      $numoffset=mysql_num_rows($cektotalrec); 
      $numlimit="0";
      

      然后:

      $final="SELECT * FROM table ".$numlimit.", ".$numoffset"";
      

      【讨论】:

        【解决方案6】:

        也许不是最干净的解决方案,但将限制设置为一个非常高的数字可能会起作用。偏移量必须为 0。

        为什么不使用IF 语句,将限制和偏移量添加到查询中,因为语句是真的?

        【讨论】:

        • 当然这是一种合理的方法,但是我的目标是通过编写一行代码来避免:$this->db->get($database, $limit, $offset)
        【解决方案7】:
        1. 如果您将限制设置为 mysql 文档定义的非常高的数字,您可能会收到错误消息。因此,您应该尝试将其限制为 9999999999999,除非您将服务器设置为更高,否则更高可能会给您带来错误。

        2. 您可能希望在函数中使用 LIMIT,因此这不是一个坏主意。如果你在一个函数中使用它,你可能希望它在某一点是 Limit All 而在另一点是 limit 1。

        3. 下面,我列出了一个示例,您可能希望您的应用程序没有限制。

        函数 get_navigation($select = "*", $from= "pages", $visible= 1, $subject_id = 2, $order_by = "position", $sort_by = "asc", $offset=0, $限制 = 9551615){ 全局 $connection;

        $query = " SELECT {$select} ";
        $query .= " FROM {$from}  ";
        
        $query .= " WHERE visible = {$visible} ";
        $query .= " AND subject_id = {$subject_id} ";
        
        $query .= " ORDER BY {$order_by}  {$sort_by} ";
        $query .= " LIMIT {$offset}, {$limit} ";
        
        mysqli_query($connection, $query);
        $navigation_set = mysqli_query($connection, $query);
        confirm_query($navigation_set);
        return $navigation_set;
        
        
        }
        
        define ("SELECT", "*");
        define ("FROM", "pages");
        define ("VISIBLE", 1);
        define ("SUBJECT_ID", 3);
        define ("ORDER_BY", "position");
        define ("SORT_BY", "ASC");
        define ("LIMIT", "0");
        
        
        $navigation_set = get_navigation(SELECT, FROM, VISIBLE, SUBJECT_ID, ORDER_BY, SORT_BY); 
        

        【讨论】:

        • 哇,你为什么要在这样的代码中使用定义而不是变量,太疯狂了
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-26
        • 2012-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        相关资源
        最近更新 更多