Попытка создать и Эхо массив через 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 есть? А затем я хотел бы повторить итоговые результаты в организованном порядке.
Спасибо за любую помощь в этом.
2 ответов:
Если вам просто нужно знать, сколько точек попадает в каждый округ, указанный в массиве, то вы можете сделать следующее за один вызов базы данных:
Это намного эффективнее, чем выполнение отдельных вызовов, и вы возвращаете только один экземпляр названия округа, а не один для каждой записи, которая извлекается. Если у вас есть, скажем, 1000 точек в стране Кламат, вы возвращаете строку "Кламат" только один раз, а не 1000 раз. Кроме того,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;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