2014-07-24 130 views
0

我們正在將我們的應用程序之一從PostgreSQL遷移到MySQL。我們在POSTGRES下面的查詢 -統計數據庫中的記錄總數,但只返回X記錄

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秒,有時甚至超時。

回答

2

我想你想使用FOUND_ROWS()CALC_FOUND_ROWS()。您可以查閱文檔here

的基本思路是:

select CALC_FOUND_ROWS id, . . . 
. . . 

然後使用功能FOUND_ROWS()的值返回給應用程序。

不幸的是,要獲得這個值作爲列值,我想你需要運行兩次查詢,主要有:

select . . ., x.cnt 
from . . . cross join 
    (select count(*) as cnt from <your query here>) x 
. . . 
+0

'SELECT SQL_CALC_FOUND_ROWS ...'得到的結果在一個查詢的一種方式(使用支持多個結果集的客戶端)將兩個查詢包裝在存儲過程中。我有一個我使用的接受「每頁行數」和「頁碼」作爲參數,爲你做數學運算,以便設置限制和偏移量,並返回第二個結果集的總行數,並做一些可愛的含糖計算告訴應用程序什麼「頁碼」是第一個(當然總是1),前一個,當前,下一個和最後一個。 –