Php 计算数据库中的记录总数,但只返回X条记录
我们正在将一个应用程序从PostGreSQL迁移到MySQL。我们在PostGres中有以下查询-Php 计算数据库中的记录总数,但只返回X条记录,php,mysql,sql,database,postgresql,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 WHER
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;
我们正在尝试将此查询移植到MySQLad,我们已经找到了这个方法-
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\u ROWS()
和CALC\u FOUND\u ROWS()
。您可以查看文档
基本思想是:
select CALC_FOUND_ROWS id, . . .
. . .
然后使用函数FOUND\u ROWS()
将值返回给应用程序
不幸的是,要将此值作为列值获取,我认为需要运行两次查询,基本上是:
select . . ., x.cnt
from . . . cross join
(select count(*) as cnt from <your query here>) x
. . .
选择。,x、 碳纳米管
从…起交叉连接
(选择count(*)作为cnt from)x
. . .
选择SQL\u CALC\u FOUND\u ROWS…
在一个查询中获得结果的一种方法(使用支持多个结果集的客户端)是将两个查询包装在一个存储过程中。我有一个我使用的,接受“每页行数”和“页码”作为参数,为你做数学运算,以便设置限制和偏移量,并返回第二个总行数结果集,并进行一些可爱的甜计算,告诉应用程序“页码”是第一个(当然总是1)、上一个、当前的、下一个和最后一个。