Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 计算数据库中的记录总数,但只返回X条记录_Php_Mysql_Sql_Database_Postgresql - Fatal编程技术网

Php 计算数据库中的记录总数,但只返回X条记录

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

我们正在将一个应用程序从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;
我们正在尝试将此查询移植到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)、上一个、当前的、下一个和最后一个。