【问题标题】:How to get total count of this query without calling another one?如何在不调用另一个查询的情况下获得此查询的总数?
【发布时间】:2016-12-06 23:51:04
【问题描述】:

我有一个查询,我需要在分页之前获取总计数。我想知道是否有办法在执行限制之前返回同一查询中的总数。如果可能的话,我必须将总值传递给我的后端。

查询的作用-
- 查找指定半径内的行,
- 匹配用户输入的关键字,
- 按日期订购,然后限制,
- 分页偏移量。

SELECT *,   
( 3959 * acos (cos ( radians(?) )* cos( radians( lat ) )*cos( radians( lng ) - radians(?) )+ sin ( radians(?) )* sin( radians( lat ) ))) AS distance   
  FROM job_posting  
 where job_title like ?  
 HAVING distance < ?   
ORDER BY date_created DESC   
limit ?, 25  

我查看了几个不同的示例,但不确定如何在此查询中实现它。任何建议都有帮助。

【问题讨论】:

  • 记住一个查询返回一个以表格形式显示的结果,你想如何实现你的答案? (根据需要制作 3 个假返回行,我们将看看 SQL 中是否有办法做到这一点);但据我所知,您可能需要进行两次查询...

标签: mysql sql


【解决方案1】:

效率不高,也不是特别优雅。计算所有符合条件的项目与检索特定的行块是完全不同的操作,通过组合它们几乎没有什么收获。

从逻辑上讲,任何同时返回行数和总行数的语句实际上都包含两个查询,它们笨拙地混合在一起,并且当您只需要一次时,计数将附加到每一行。您可以通过 SELECT COUNT... 中的 JOINing 作为子查询 ON TRUE 来完成此操作,但您最好在后端分解分页逻辑以运行计数和检索查询,特别是如果它是常见的需求你的申请。

【讨论】:

    【解决方案2】:

    从技术上讲,使用sql_calc_found_rows modifier in the select statement and then retrieving the count with found_rows() function 是可能的。

    SELECT sql_calc_found_rows *,   
    ( 3959 * acos (cos ( radians(?) )* cos( radians( lat ) )*cos( radians( lng ) - radians(?) )+ sin ( radians(?) )* sin( radians( lat ) ))) AS distance   
      FROM job_posting  
     where job_title like ?  
     HAVING distance < ?   
    ORDER BY date_created DESC   
    limit ?, 25;
    
    select found_rows();
    

    但是,正如this excellent SO topic 所讨论的,大多数情况下执行另一个select count(*)... 查询会更快。

    对两种方式都进行测试并使用对您来说更快的方式。

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2010-10-10
      • 2014-01-15
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多