计算数据库中记录的总数,但只返回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
. . .