从表中获取值的间隔为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)
。
答
随着for循环,你正在做很多数据库调用。我会做两个电话。第一个查询将获得表中的最大ID。创建一个int数组或列表,其id为选定的增量,最大值为id。将列表输出为逗号分隔的字符串。然后用“where ID in(id string)”中的第二个查询。
第二个查询将会更大,但是大部分时间都是在重复查询过程中没有太多数据返回的大小。
谢谢戈登:)我有你的generate_series()函数,它的工作原理!但将其添加到我的查询中,我得到一个错误,如列“c.elev”不存在。可能是我的Postgres版本(我使用Postgres v1.16.1)。我会试着看看是否有Postgres相当于它。 – Loupi
@Loupi。 。 。我认为这应该是“提升”。 –
...哦,没有看清楚:)谢谢 – Loupi