2014-07-24 2 views
0

우리는 우리의 응용 프로그램 중 하나를 PostGreSQL에서 MySQL로 전환하고 있습니다.데이터베이스의 총 레코드 수를 계산하지만 X 레코드 만 반환합니다

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; 

일부 필드의 변화가있다하지만,에 - MySQL의 광고에이 쿼리이 함께 와서 우리는 포트에 노력하고있다

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; 

- 우리는 POSTGRES에서 다음 쿼리를 모든 의도 된 기능은 동일해야합니다.

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

'SQL_CALC_FOUND_ROWS를 SELECT ...'하나 개의 쿼리의 결과를 얻을 수있는 한 가지 방법을 (다중 결과 세트를 지원하는 클라이언트)는 저장된 프로 시저에서 두 개의 쿼리를 모두 래핑하는 것입니다. 나는 "페이지 당 행 수"및 "페이지 수"를 인수로 사용하고 제한 및 오프셋을 설정하고 총 행 수와 함께 두 번째 결과 집합을 반환하도록 수학을 수행하며 귀찮은 계산을 수행합니다. "페이지 번호"가 처음 (항상 1 개), 이전, 현재, 다음 및 마지막 인 항목을 앱에 알립니다. –

관련 문제