Что нового

[Сеть, интернет] PHP + сложный запрос в PostgeSQL

cobra2029

Новичок
Сообщения
54
Репутация
0
Ув. знатоки, здравствуйте!
Я прекрасно понимаю, что тема PHP не имеет отношения к Auto IT но сложилась такая ситуация, очень нужна помощь, в связи с этим создаю эту тему.

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

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


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

SQL:
SELECT "Date" FROM "public"."ObjectLog1" ORDER BY "Date" DESC LIMIT 1

таблица object_ip имеет вид (понятно что не выкладываю все записи, не имеет смысла):
SQL:
"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 адресе объекта:
SQL:
-- ----------------------------
-- 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


OffTopic:
не предлагать изменить структуру базы, это не реально
я не прошу сделать все за меня, только подтолкнуть на мысль в какую строну копать


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

PHP:
$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);
?>
теперь вопрос:
как исключить из этого запроса
PHP:
$result1 = pg_query("SELECT \"Date\" FROM \"public\".\"ObjectLog". $z ."\" ORDER BY \"Date\" DESC LIMIT 1;");
объекты которых нет?

Заранее всем кто откликнется большое спасибо за помощь.
 
Верх