2016-06-15 1 views
0

안녕하세요. 이전에 물어 본 적이 있는지 모르겠지만 ID와 숫자의 테이블에서 값을 가져오고 싶습니다. 1 - 190). 주어진 간격은 20, 10, 5입니다.witn 간격으로 20, 10, 5의 값을 가진 테이블에서 값을 얻으십시오.

간격을 10으로 설정하면 10, 20, 30, 40 ... 190과 같은 숫자 값을 얻을 수 있습니다. 20이면 20, 40, 60 등의 값을 얻을 것입니다.

루프에 을 사용하려고했지만 성능 및 속도가 현저하지 않습니다.

저는 PHP를 사용하여 Postgres에서 데이터를 쿼리합니다. 이 값으로 시리즈를 생성 할 경우

$interval = intval($_REQUEST['interval']); 

    $sql_last = 'SELECT MAX(elevation) AS elev FROM "Contour"'; 
    $result_last = pg_prepare($conn, 'query_last', $sql_last); 
    $result_last = pg_execute($conn, 'query_last', array()); 

    $row_last = pg_fetch_array($result_last, NULL, PGSQL_ASSOC); 
    $max_elev = $row_last['elev']; 

    for($x = $interval; $x < $max_elev; $x + $interval) { 
     $sql = 'SELECT id, elevation FROM "Contour" WHERE elevation = $1'; 
     $result = pg_prepare($conn, $x, $sql); 
     $result = pg_execute($conn, $x, array($x)); 

    } 

답변

1

, 당신은 할 수 있습니다 :

select generate_series(0, 190, 10) as val 

당신이 당신 같은 쿼리에이를 포함하려면 여기

내 샘플 코드입니다 :

select c.* 
from contour c join 
    (select generate_series(min(c2.elev), max(c2.elev), 10) as elev 
     from contour c2 
    ) cc 
    on c.elevation = c2.elev; 

당신은 0min(c2.elev)을 대체 할 수 있습니다.

+0

고든 : 고맙습니다 :) generate_series() 함수를 사용했는데 작동했습니다! 하지만 내 쿼리에 추가하면 "c.elev"열과 같은 오류가 발생하지 않습니다. 내 버전의 Postgres (Postgres v1.16.1 사용) 일 수 있습니다. Postgres에 해당하는 것이 있는지 알아볼 것입니다. – Loupi

+0

@ 루피. . . 나는 이것이 '고도'라고 생각한다. –

+0

... 오, 분명히 보이지 않았다 :) 감사합니다. – Loupi

1

for 루프를 사용하면 많은 db 호출을 수행 할 수 있습니다. 나는 두 번 전화 할 것입니다. 첫 번째 쿼리는 테이블에서 최대 ID를 얻습니다. 선택한 ID가 최대 증분으로 올라가는 int 배열 또는 목록을 만듭니다. 목록을 쉼표로 구분 된 문자열로 출력하십시오. 그런 다음 두 번째 쿼리에서 "ID in (id string)"을 찾습니다.

두 번째 쿼리는 더 커지지 만 대부분의 시간은 데이터를 반복적으로 반환하지 않고 반복적으로 쿼리를 만드는 과정에 있습니다.

관련 문제