我有一个查询,我需要在分页之前获得总计数。我想知道在执行限制之前是否有办法在同一查询中返回总计数。如果可能的话,我必须将总价值传递给我的后端。
查询的内容 -
- 找到指定半径范围内的行,
- 与用户输入的关键字匹配,
- 按日期排序,然后限制,
- 分页偏移。
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
我看了几个不同的例子,但不知道如何在这个查询上实现它。任何建议都有帮助
答案 0 :(得分:1)
效率不高,而且不是特别优雅。计算匹配条件的所有项目与检索某些行的行程是完全不同的,这些行通过组合它们几乎无法获得。
逻辑上,任何返回行和总行数的单个语句实际上都包含两个笨拙地混在一起的查询,当你只需要一次时,计数将被附加到每一行。您可以JOIN
作为子查询SELECT COUNT...
ON TRUE
进行此操作,但您可能最好在后端分解分页逻辑以运行计数和检索查询,尤其是如果这是您申请中的常见需求。
答案 1 :(得分:0)
从技术上讲,可以使用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(*)...
查询会更快。
测试两种方式并使用更快的方式。