簡體   English   中英

計算數據庫中的記錄總數,但僅返回X條記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM