Перейти к содержимому

Сервис обмена электронных валют

Выбрать шаблон и создать сайт

PHP + сложный запрос в PostgeSQL

#1 cobra2029

cobra2029
  • Пользователь
  • 10 сообщений
  • Репутация: 0
0

Отправлено 02 Март 2012 - 12:38

Ув. знатоки, здравствуйте!
Наткнулся на ваш замечательный форум, нашел множество ответов на необходимые мне вопросы, но на один так ответа не нашел.
В связи с этим создаю эту тему.

Итак, начну с описания задачи:

Имеется сервер, на нём крутится база PostgreSQL (объем базы порядка 4tb).
Структура базы следующая:
Таблици:
ObjectLog1
..................
ObjectLog1000
..................
ObjectLogN


object_ip

всю структуру описывать не имеет смысла. Каждая таблица ObjectLog является контейнером для данных по 1-му объекту (в данный момент объектов всего 27567 (т.е. ObjectLog1 - ObjectLog27567), количество объектов растёт каждый день).
из каждой таблици ObjectLog меня интересует только колонка Data,
вот sql скрипт для выборки из одной таблици:
SELECT "Date" FROM "public"."ObjectLog1" ORDER BY "Date" DESC LIMIT 1


таблица object_ip имеет вид (понятно что не выкладываю все записи, не имеет смысла):

"id" int4 DEFAULT NULL NOT NULL,
"addr" inet DEFAULT NULL,
CONSTRAINT "pk_object_ip" PRIMARY KEY ("id")
)
WITH OIDS
;

ALTER TABLE "public"."object_ip" OWNER TO "postgres";



CREATE INDEX "object_ip_index" ON "public"."object_ip" USING btree ("addr");

ALTER INDEX "object_ip_index" OWNER TO "object_ip";;

-- ----------------------------
-- Records of object_ip
-- ----------------------------
INSERT INTO "object_ip" VALUES ('1', '10.145.22.25');


Теперь логическая связь:
имя каждой таб. ObjectLog содержит в себе порядковый номер объекта (пример ObjectLog1 );
В таб. object_ip, каждая строка несет информацию об ip адресе объекта:

-- ----------------------------
-- Records of object_ip
-- ----------------------------
INSERT INTO "object_ip" VALUES ('1', '10.145.22.25');
запись: ('1', '10.145.22.25') подразумевает что объекту 1 (таблица ObjectLog1) соответствует ip 10.145.22.25.

Итак, что должно получиться:

на экран выводится информация в виде таблицы, отсортированная по последней дате, в таком виде (так я себе представляю):

Объект Дата и время последней записи ip адресс


объект1 2012-02-27 19:51:48 10.1.100.89
объект2 2012-02-27 20:51:48 10.1.100.88
............................................................................................................................

объектN 2012-03-01 04:01:48 10.10.69.14



Теперь сами вопросы:

1. как мне узнать сколько всего таблиц ObjectLog ?
2. как создать sql скрипт, который будет выводить последнюю дату по каждой из существующей таблицы ObjectLog ?
3. как выводить на экран "связку" объект1 2012-02-27 19:51:48 10.1.100.89 ?

Заранее спасибо за помощь.

P.S. не предлагать изменить структуру базы, это не реально
P.S.2. я не прошу сделать все за меня (хотя нет, вру: прошу сделать 2-й скрипт).

 

 

  • 0

#2 cobra2029

cobra2029
    Topic Starter
  • Пользователь
  • 10 сообщений
  • Репутация: 0

Отправлено 02 Март 2012 - 17:15

собственно вот чего добился


$conn = pg_connect("host=10.1.0.1 dbname=xxx user=postgres") or die("Не соединилось!!!");

if (!$conn) {
  echo "Произошла ошибка.n";
  exit;
}
// используя  файлы
//$data1 = file_get_contents('data.txt');
//$data2 = file_get_contents('ip.txt');
//$data3 = file_get_contents('name.txt');

$s = pg_query("SELECT COUNT(*) FROM information_schema.tables");
$i = pg_fetch_array($s);
// првоерим что выводится
//echo $i[0] . "n";
$x=$i[0];
// првоерим что выводится
//echo $x;
for ( $z=1; $z<=$x; $z++) {

// Экранирование спецсимволов в строке
  //$escaped1 = pg_escape_string($data1);
// $escaped2 = pg_escape_string($data2);
  //$escaped3 = pg_escape_string($data3);
  
  /* Выполнение SQL запроса */
$result1 = pg_query("SELECT "Date" FROM "public"."ObjectLog". $z ."" ORDER BY "Date" DESC LIMIT 1;");
$result2 = pg_query("SELECT * FROM "public"."object_ip" ORDER BY "id" ");
$result3 = pg_query("SELECT * FROM information_schema.tables WHERE table_type='BASE TABLE' and table_name='ObjectLog". $z ."'");
// првоерим что выводится
//$b = pg_fetch_array($result3);
//echo $b[0] . "n";
//echo $b[1] . "n";
//echo $b[2] . "n";
if (!$result1) {
  echo "Произошла ошибка.n";
  exit;
}
if (!$result2) {
  echo "Произошла ошибка.n";
  exit;
}
if (!$result3) {
  echo "Произошла ошибка.n";
  exit;
}
  echo "
";
  echo "
n";
echo "";

  echo "";
  echo "";

	echo "";

echo "";

while (($row = pg_fetch_row($result1))&&($pow = pg_fetch_row($result2)) && ($wow = pg_fetch_row($result3)) ){
echo "";

echo "";

  echo "";
  echo "";

echo "";
}
echo "										";
				  echo"Объект";
				echo "							";
				  echo"Дата последней записи";
				  echo"							";
				  echo"IP Адресс";
				  echo"											";
				  echo"$wow[2]";
				echo "							";
				  echo"$row[0]";
				echo "							";
				  echo "$pow[1]";
				  echo"			
";
}
pg_close($conn);
?>

теперь вопрос:
как исключить из этого запроса $result1 = pg_query("SELECT "Date" FROM "public"."ObjectLog". $z ."" ORDER BY "Date" DESC LIMIT 1;"); объекты которых нет?
  • 0

#3 cobra2029

cobra2029
    Topic Starter
  • Пользователь
  • 10 сообщений
  • Репутация: 0

Отправлено 03 Март 2012 - 12:21

проблема не решена... ну натолкните на мысль хотя бы в какую сторону копать???
  • 0

#4 cobra2029

cobra2029
    Topic Starter
  • Пользователь
  • 10 сообщений
  • Репутация: 0

Отправлено 16 Март 2012 - 11:03

актуально
  • 0

#5 DioNiR

DioNiR
  • Пользователь
  • 11 сообщений
  • Репутация: 2

Отправлено 16 Март 2012 - 12:06

в смысле объекты которых нет?


Прочитал первый пост вроде допер до последнего вопроса.

pg_query("SELECT \"Date\" FROM \"public\".\"ObjectLog". $z ."\" ORDER BY \"Date\" DESC LIMIT 1;");


Скрипт вроде как выдаст ошибку если такой таблицы не будет
Что мешает этим воспользоваться?
  • 0

#6 cobra2029

cobra2029
    Topic Starter
  • Пользователь
  • 10 сообщений
  • Репутация: 0

Отправлено 16 Март 2012 - 13:54

DioNiR, собственно если есть ошибка он останавливает работу и пишет об ошибке, не могу пока, что догнать как эту ошибку отловить и только после этого формировать таблицу.


  • 0

#7 DioNiR

DioNiR
  • Пользователь
  • 11 сообщений
  • Репутация: 2

Отправлено 16 Март 2012 - 14:02

а что тут догонять:

if (!$result1) {
  echo "Произошла ошибка.n";
  exit;
}

Собственно и есть твоя ошибка, и остановка скрипта.

Но если написать вот так:
if (!$result1) {
  continue;
}
То если не будет таблицы, скрипт перейдет к следующему номеру циклу.
  • 1

#8 cobra2029

cobra2029
    Topic Starter
  • Пользователь
  • 10 сообщений
  • Репутация: 0

Отправлено 05 Апрель 2012 - 08:57

это замечательно и понятно а как быть с вот такой ошибкой?
"Warning: pg_query() [function.pg-query]: Query failed: ERROR: relation "public.ObjectLog224" does not exist in W:serversystemhtmlindex.php on line 38"

как избавиться от вывода её на экран?
  • 0

#9 c0ns0l3

c0ns0l3
  • Пользователь
  • 264 сообщений
  • Репутация: 49

Отправлено 05 Апрель 2012 - 13:59

display error's?
  • 0

#10 cobra2029

cobra2029
    Topic Starter
  • Пользователь
  • 10 сообщений
  • Репутация: 0

Отправлено 12 Апрель 2012 - 08:40

приведите пример использования.

Заранее спасибо.


  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru