Мне нужно сделать запрос из базы данных, которая содержит более 50 таблиц — и все они имеют одинаковую структуру (я знаю, проект Horrid Database из унаследованного проекта, который разрабатывался более 5 лет!). Для этого я запросил information_Schema
как ниже:
SELECT
TABLE_NAME
FROM
INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA =
'projectdatabase'
AND
TABLE_NAME LIKE '%_usertable'
Что дает мне около 50 таблиц, которые мне нужны, в результате. Теперь мне нужно запросить столбцы внутри каждой из этих таблиц, например, PRODUCT_ID
, При этом я попытался:
SELECT
projectdatabase.userTable.PRODUCT_ID
FROM (
SELECT
TABLE_NAME as userTable
FROM
INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA =
'projectdatabase'
AND
TABLE_NAME LIKE '%_usertable'
) AS userTables
Теперь это, очевидно, не работает из-за того, что MySQL не рассматривает ‘userTable’ как таблицу базы данных — но я пытаюсь сделать это запрос * FROM {tablename}
где tablename
был information_schema
результат запроса.
Я мог бы попытаться разделить это на PHP, хотя мне очень хотелось бы узнать, возможно ли это сделать в MySQL.
Вы должны использовать подготовленное заявление:
SET @sql:=(SELECT GROUP_CONCAT(
CONCAT("SELECT PRODUCT_ID FROM ", TABLE_NAME) SEPARATOR " UNION ")
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'projectdatabase'
AND TABLE_NAME LIKE '%_usertable');
PREPARE stmt FROM @sql;
EXECUTE stmt;
РЕДАКТИРОВАТЬ: Вы также можете установить SET SESSION group_concat_max_len = 1000000;
, но делать все в SQL не то, что нужно делать. Ваш список таблиц является своего рода константой, и запрос будет в лучшем месте в вашем PHP-коде.
Адам заслуживает награды. group_concat_max_len
может быть захвачен и восстановлен, если хотите. И вы можете сделать это еще больше. Так что я не вижу проблемы с надежностью. И я согласен, что вы не можете иметь имя таблицы как «переменную».
Эквивалент PHP будет выглядеть примерно так:
Получить список таблиц от
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'projectdatabase'
AND TABLE_NAME LIKE '%_usertable';
Либо строить UNION
, Предложение Адама, или запустить 50 SELECT
с, каждый на основе одного имени таблицы из приведенного выше списка. Затем объедините их, как вы хотите.
Рекомендую продумать UNION DISTINCT
против UNION ALL
,