计算数据库中的记录总数,但仅返回X记录

时间:2014-07-24 12:08:14

标签: php mysql sql database postgresql

我们正在将我们的一个应用程序从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秒,有时甚至超时。

1 个答案:

答案 0 :(得分: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
. . .