Запрос из таблицы, который получен из результата Information_Schema.Tables

Мне нужно сделать запрос из базы данных, которая содержит более 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.

4

Решение

Вы должны использовать подготовленное заявление:

 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-коде.

5

Другие решения

Адам заслуживает награды. group_concat_max_len может быть захвачен и восстановлен, если хотите. И вы можете сделать это еще больше. Так что я не вижу проблемы с надежностью. И я согласен, что вы не можете иметь имя таблицы как «переменную».

Эквивалент PHP будет выглядеть примерно так:

  1. Получить список таблиц от

    SELECT TABLE_NAME
    FROM INFORMATION_SCHEMA.tables
    WHERE TABLE_SCHEMA = 'projectdatabase'
    AND TABLE_NAME LIKE '%_usertable';
    
  2. Либо строить UNION, Предложение Адама, или запустить 50 SELECTс, каждый на основе одного имени таблицы из приведенного выше списка. Затем объедините их, как вы хотите.

Рекомендую продумать UNION DISTINCT против UNION ALL,

0

По вопросам рекламы [email protected]