Ув. знатоки, здравствуйте!
Я прекрасно понимаю, что тема PHP не имеет отношения к Auto IT но сложилась такая ситуация, очень нужна помощь, в связи с этим создаю эту тему.
Итак, начну с описания задачи:
Имеется сервер, на нём крутится база PostgreSQL (объем базы порядка 4tb).
Структура базы следующая:
всю структуру описывать не имеет смысла. Каждая таблица ObjectLog является контейнером для данных по 1-му объекту (в данный момент объектов всего 27567 (т.е. ObjectLog1 - ObjectLog27567), количество объектов растёт каждый день).
из каждой таблици ObjectLog меня интересует только колонка Data,
вот sql скрипт для выборки из одной таблици:
таблица object_ip имеет вид (понятно что не выкладываю все записи, не имеет смысла):
Теперь логическая связь:
имя каждой таб. ObjectLog содержит в себе порядковый номер объекта (пример ObjectLog1 );
В таб. object_ip, каждая строка несет информацию об ip адресе объекта:
запись: ('1', '10.145.22.25') подразумевает что объекту 1 (таблица ObjectLog1) соответствует ip 10.145.22.25.
Итак, что должно получиться:
на экран выводится информация в виде таблицы, отсортированная по последней дате, в таком виде (так я себе представляю):
собственно вот чего добился
теперь вопрос:
как исключить из этого запроса
объекты которых нет?
Заранее всем кто откликнется большое спасибо за помощь.
Я прекрасно понимаю, что тема PHP не имеет отношения к Auto IT но сложилась такая ситуация, очень нужна помощь, в связи с этим создаю эту тему.
Итак, начну с описания задачи:
Имеется сервер, на нём крутится база PostgreSQL (объем базы порядка 4tb).
Структура базы следующая:
Таблицы:
ObjectLog1
..................
ObjectLog1000
..................
ObjectLogN
object_ip
ObjectLog1
..................
ObjectLog1000
..................
ObjectLogN
object_ip
из каждой таблици 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');
Итак, что должно получиться:
на экран выводится информация в виде таблицы, отсортированная по последней дате, в таком виде (так я себе представляю):
Объект Дата и время последней записи 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 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;");
Заранее всем кто откликнется большое спасибо за помощь.