MySQL SELECT из группы таблиц, извлеченных из INFORMATION_SCHEMA - PullRequest
3 голосов
/ 11 октября 2010

Привет всем.У меня есть следующий набор таблиц, который является переменной и складывается каждый день:

data-2010-10-10
data-2010-10-11
data-2010-10-12
data-2010-10-13

И так далее.Все таблицы имеют одинаковую структуру, и я хотел бы выбрать материал из всех таблиц одновременно.Я не могу использовать таблицу MERGE, так как я использую InnoDB.В любом случае, я использую следующий оператор для выбора имен таблиц в своей информационной-схеме:

select table_name from `information_schema`.`tables` 
  where `table_schema` = 'mydb2' and `table_name` like 'data-%'

, которые возвращают все таблицы, которые я хотел бы объединитьЯ также могу group_concat возвращать результаты, чтобы получить перечисленные с запятой в качестве разделителя.Теперь, когда я застрял, выполняется запрос на выборку, который фактически извлекает данные из этих таблиц.

Любые подсказки приветствуются.Спасибо!~ K

1 Ответ

3 голосов
/ 11 октября 2010

Вы должны будете использовать динамический SQL для построения запроса (или запросов), чтобы получить результаты из этих таблиц.То есть вы получаете таблицы из запроса information_schema в виде строк, а затем интерполируете эти строки в последующий запрос.

Что-то, связанное с объединением отдельных запросов для всех таблиц:

SELECT ...
FROM (SELECT * FROM `data-2010-10-10`
      UNION ALL SELECT * FROM `data-2010-10-11`
      UNION ALL SELECT * FROM `data-2010-10-12`
      UNION ALL SELECT * FROM `data-2010-10-13`) AS u

Но я ставлю под сомнение ваш дизайн создания отдельной таблицы в день.Поначалу это кажется удобным, но таблицы распространяются из-под контроля, и у вас возникают трудности с выполнением обычных запросов, например, с трудностями, с которыми вы сейчас сталкиваетесь.Это антипаттерн Я называю Метаданные Триблс .

Вероятно, ваши данные могут храниться в одной таблице со столбцом даты, чтобы вы могли различать данные за разные дни.Вероятно, вам просто нужно создать индексы, чтобы помочь запросам, которые вам нужно выполнить для общих данных.


Ваш комментарий:

Вы не можете сделать имена таблиц динамическими в SQLзапрос (включая определение представления).Вы можете интерполировать имена таблиц в строку, а затем подготовить строку как запрос SQL.

Вы можете построить строку с помощью функции CONCAT(), а затем использовать PREPARE и EXECUTE для запуска строки в качестве запроса.Но поскольку в клиенте mysql нет структур циклов, вам придется написать хранимую процедуру, чтобы сделать это, если вы не можете написать скрипт на Python или PHP или на каком-либо другом языке хоста.

...