[英]Count the total number of records in the database but return only X records
我們正在將其中一個應用程序從PostGreSQL移植到MySQL。 我們在PostGres中有以下查詢-
SELECT
idrte
, left_name
, gacodemun
, clsrte
, speed
, speed_override
, ST_AsGeoJSON(geometry) AS geometry
, count(idrte) OVER() AS total
FROM
aq_routes
WHERE
ST_CONTAINS(
GeomFromText(
'Polygon(($geom))'
),geometry)
GROUP BY
idrte
, left_name
, gacodemun
, clsrte
, speed
, speed_override
, geometry
ORDER BY left_name
LIMIT 150;
我們正在嘗試將此查詢移植到MySQL廣告中,並提出了以下建議-
SELECT
id AS id
, left_name AS left_name
, left_locality AS left_locality
, class AS class
, speed AS speed
, speed_override AS speed_override
, AsWKB(Geom) AS geom
, count(id) AS total
FROM road_segments
WHERE
CONTAINS(
GeomFromText(
'Polygon(($geom))'
),geom)
GROUP BY
id
, left_name
, class
, speed
, speed_override
, geom
ORDER BY left_name
LIMIT 150;
有一些字段更改,但是總體上預期的功能是相同的。
您會注意到在PostGreSQL中調用了OVER()
。 我們正在查詢的表有很多數據。 因此,對於用戶,我們僅顯示150條記錄,但告訴他所有記錄的計數。 使用PostGres可以通過一次調用來實現,但是我們在MySQL中沒有OVER()
函數。
除了第二次查詢數據庫外,我們還有什么其他選擇。 對數據庫的第二次查詢使響應時間至少增加了15秒,有時甚至超時。
我認為您想使用FOUND_ROWS()
和CALC_FOUND_ROWS()
。 您可以在此處查看文檔。
基本思想是:
select CALC_FOUND_ROWS id, . . .
. . .
然后使用函數FOUND_ROWS()
將值返回給應用程序。
不幸的是,要將此值作為列值,我認為您需要兩次運行查詢,本質上是:
select . . ., x.cnt
from . . . cross join
(select count(*) as cnt from <your query here>) x
. . .
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.