从表中获取值的间隔为20,10,5

问题描述:

您好我不知道这是否曾被问过,但我想从一个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)); 

    } 

如果你想生成这些值的一个系列,你可以这样做:

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

随着for循环,你正在做很多数据库调用。我会做两个电话。第一个查询将获得表中的最大ID。创建一个int数组或列表,其id为选定的增量,最大值为id。将列表输出为逗号分隔的字符串。然后用“where ID in(id string)”中的第二个查询。

第二个查询将会更大,但是大部分时间都是在重复查询过程中没有太多数据返回的大小。