Попытка создать и Эхо массив через PG query params



Я немного работал с Postgresql, но я все еще новичок. Я обычно по умолчанию создаю слишком много запросов и взламываю свой путь, чтобы получить результат, который мне нужен от запроса. На этот раз я хотел бы написать более упорядоченный код, так как я буду иметь дело с большой базой данных, и код должен быть максимально кратким.



Таким образом, у меня есть много точечных данных, а затем у меня есть много округов. У меня есть две таблицы, "округа" и "ltg_data" (много точек). Моя цель-читать. через заданное число округов (как указано в массиве) и определить, сколько точек приходится на каждый округ. Мой новичок, повторяющийся и неэффективный способ сделать это-написать запросы, подобные этому:

$klamath_40_days = pg_query($conn, "SELECT countyname, time from counties, ltg_data where st_contains(counties.the_geom, ltg_data.ltg_geom) and countyname");
$klamath_rows = pg_num_rows($klamath_40_days);


Если я выполняю отдельный запрос, подобный приведенному выше, для каждого округа, это дает мне хороший результат, но он повторяется и неэффективен. Я бы предпочел использовать петлю. И в конечном итоге мне нужно будет передать params в запрос через URL. Когда я пытаюсь запустить цикл for в PHP, я получаю ошибки, говорящие: "ошибка запроса: столбец "Джексон" не существует " и т. д. Вот цикл:



$counties = array ('Jackson', 'Klamath');

foreach ($counties as $i) {
echo "$i<br>";

$jackson_24 = pg_query($conn, "SELECT countyname, time from counties, ltg_data where st_contains(counties.the_geom, ltg_data.ltg_geom) and countyname = ".$i." and time >= (NOW() - '40 DAY'::INTERVAL)");
$jackson_rows = pg_num_rows($result);

}

echo "$jackson_rows";


Поэтому я исследовал функцию pg_query_params в PHP, и я подумал, что это поможет. Но я запускаю этот скрипт:



$counties = array('Jackson', 'Josephine', 'Curry', 'Siskiyou', 'Modoc', 'Coos', 'Douglas', 'Klamath', 'Lake');

$query = "SELECT countyname, time from counties, ltg_data where st_contains(counties.the_geom, ltg_data.ltg_geom) and countyname = $1 and time >= (NOW() - '40 DAY'::INTERVAL)";

$result = pg_query_params($conn, $query, $counties);


И я получаю эту ошибку: Query failed: ERROR: bind message поставляет 9 параметров, но подготовленный оператор "" требует 1 в



Поэтому я в основном задаюсь вопросом, как лучше всего передать параметры (либо отдельные из, возможно, URL-адреса, переданного param, либо несколько элементов в array) к запросу postgresql есть? А затем я хотел бы повторить итоговые результаты в организованном порядке.



Спасибо за любую помощь в этом.

581   2  

2 ответов:

Если вам просто нужно знать, сколько точек попадает в каждый округ, указанный в массиве, то вы можете сделать следующее за один вызов базы данных:

SELECT countyname, count(*)
FROM counties
JOIN ltg_data ON ST_contains(counties.the_geom, ltg_data.ltg_geom)
WHERE countyname = ANY ($counties)
AND time >= now() - interval '40 days'
GROUP BY countyname;
Это намного эффективнее, чем выполнение отдельных вызовов, и вы возвращаете только один экземпляр названия округа, а не один для каждой записи, которая извлекается. Если у вас есть, скажем, 1000 точек в стране Кламат, вы возвращаете строку "Кламат" только один раз, а не 1000 раз. Кроме того, php не обязательно считать длина результата запроса. В целом все намного чище и быстрее.

Обратите также внимание на синтаксис JOIN в сочетании с вызовом функции PostGIS.

Для выполнения запроса с параметром в цикле для нескольких значений можно использовать следующий шаблон:

$counties = array('Jackson', 'Josephine', 'Curry');
$query = "SELECT countyname, time from counties where countyname = $1";

foreach ($counties as $county) {
    $result = pg_query_params($conn, $query, array($county));
    $row = pg_fetch_row($result);
    echo "$row[0]  $row[1]  \n";
}
Обратите внимание, что третий параметр pg_query_params() является массивом, поэтому вы должны поместить array($county), хотя есть только один параметр.

Вы также можете выполнить один запрос с массивом в качестве параметра. В этом случае следует использовать синтаксис postgres для массива и передать его в запрос в виде текстовой переменной.

$counties = "array['Jackson', 'Josephine', 'Curry']";
$query = "SELECT countyname, time from counties where countyname = any ($counties)";
echo "$query\n\n";
$result = pg_query($conn, $query);
while ($row = pg_fetch_row($result)) {
    echo "$row[0]  $row[1]  \n";
}

Comments

    Ничего не найдено.