【问题标题】:Is there an efficient way to get a full count and results (with LIMIT) in one SQL call?有没有一种有效的方法可以在一次 SQL 调用中获得完整的计数和结果(使用 LIMIT)?
【发布时间】:2019-12-05 07:43:03
【问题描述】:

我正在使用带有 SQLite 的 PHP PDO 来选择一些有限制的行,但也想获得可能结果的总数。

现在我可以做到:

SELECT COUNT(*) FROM table WHERE XXX

SELECT * FROM table WHERE XXX LIMIT 30

但这是两个数据库调用,感觉它们可能会以某种方式合并为一个。我也可以这样做:

SELECT * FROM table WHERE XXX

然后通过 PHP 执行 COUNTLIMIT。尽管该数据库调用将返回数百甚至数千行和列的数据,这些数据将在计数之外被忽略。

是否有一些很酷的 SQL 或 PDO 方法可以在一个数据库调用中执行我想要的操作而不返回多余的数据?如果没有...在我提出的两个选项之间有推荐的方法吗?

【问题讨论】:

    标签: sql sqlite pdo


    【解决方案1】:

    您可以只在外部选择中包含一个不相关的计数子查询:

    SELECT
        (SELECT COUNT(*) FROM yourTable WHERE xxx) AS cnt,
        t.*
    FROM yourTable t
    WHERE XXX
    ORDER BY t.some_col
    LIMIT 30;
    

    【讨论】:

    • 好的,这样只会在每一行添加一个 cnt 列吗?仍然不理想,但比我迄今为止想出的任何东西都要好。谢谢。
    • @DanGoodspeed 事实上,SQLite 应该只需要评估一次计数查询,缓存它,然后为每一行重用该值。因此,它并没有肉眼看起来那么低效。
    【解决方案2】:

    最新版本的 SQLite 支持窗口函数,所以你可以这样做:

    SELECT t.*, COUNT(*) OVER () as num_rows
    FROM table t
    WHERE XXX
    LIMIT 30;
    

    在早期版本中,我会推荐 CTE:

    with t as (
          SELECT *
          FROM table
          WHERE XXX
         )
    select t.*, (select count(*) from t)
    from t
    limit 30;
    

    这样,您不必重复条件——这可能容易出错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      相关资源
      最近更新 更多