2016-06-15 47 views
0

您好我不知道這是否曾被問過,但我想從一個ID和數字表中獲取值(數字範圍從1 - 190),給定的間隔爲20,10和5.從表中獲取值的間隔爲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; 

你可能想用0更換min(c2.elev)

+0

謝謝戈登:)我有你的generate_series()函數,它的工作原理!但將其添加到我的查詢中,我得到一個錯誤,如列「c.elev」不存在。可能是我的Postgres版本(我使用Postgres v1.16.1)。我會試着看看是否有Postgres相當於它。 – Loupi

+0

@Loupi。 。 。我認爲這應該是「提升」。 –

+0

...哦,沒有看清楚:)謝謝 – Loupi

1

隨着for循環,你正在做很多數據庫調用。我會做兩個電話。第一個查詢將獲得表中的最大ID。創建一個int數組或列表,其id爲選定的增量,最大值爲id。將列表輸出爲逗號分隔的字符串。然後用「where ID in(id string)」中的第二個查詢。

第二個查詢將會更大,但是大部分時間都是在重複查詢過程中沒有太多數據返回的大小。