Выбрать одинаковые колонки из базы данных SQL
У меня есть база данных в корой много сайтов на Wordpress и другие сайты Мне нужно вытащить все URL сайтов из всех таблиц *_options из 1 столбца в строке option_value делаю так
SHOW TABLES LIKE '%_options'
получаю все таблицы с префиксом
потом на php создаю запрос для всех таблиц через UNION
while ($row = $stmt->fetch())
{
$newsql .= "SELECT option_value FROM `".$row[0]."` WHERE option_id = 1 UNION ";
}
получается:
SELECT option_value FROM `55wp_options` WHERE option_id = 1 UNION SELECT option_value FROM `afriqueh_options` WHERE option_id = 1 UNION SELECT option_value FROM `fak_options` WHERE option_id = 1 UNION SELECT option_value FROM `test_options` WHERE option_id = 1 UNION
ВОПРОС: В бд есть таблицы с окончанием *_options но они не от вордпреса и содержат другие таблицы по этому при выполнении моего запроса выходит ошибка : #1054 - Неизвестный столбец 'option_value' в 'field list'
Весь день ищу решение, как сделать так чтобы таблицы без option_value не попадали в выборку или игнорировались при запросе.
Ответы (2 шт):
select column_name
from information_schema.columns
where table_name='".$row[0]."' and column_name='option_value'
Наличие результата в таком запросе даст вам понять, что столбец есть в таблице.
Вот полное решение вопроса. Вдруг кто то столкнется.
<?php
$user = 'root';
$pass = 'root';
$dbh = new PDO('mysql:host=localhost;dbname=database', $user, $pass);
$table_names = $dbh->query("SHOW TABLES LIKE '%_options'");
while ($row = $table_names->fetch()) {
//echo $row[0].'<br>';
$has_wp_options = $dbh->query("SELECT COLUMN_NAME FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'database'
AND TABLE_NAME = '{$row[0]}'
AND COLUMN_NAME = 'option_name'");
while ($row2 = $has_wp_options->fetch()) {
if (!empty($row2[0])) {
$site_url = $dbh->query("SELECT option_value FROM $row[0] WHERE option_name = 'siteurl'")->fetchObject();
echo 'Table of wp: ' . $row[0] . '; Siteurl: ' . $site_url->option_value."<br>";
}
}
}