выбор первого столбца из всех таблиц в базе данных MySQL - PullRequest
1 голос
/ 22 июля 2009

У меня есть столбец с именем "name", который присутствует во всех таблицах в базе данных mysql.

Я хотел перечислить все имена во всех таблицах, поэтому я использовал следующий запрос

select name from (SELECT table_name FROM information_schema.tables WHERE table_type='BASE TABLE') as abc

Но у меня это не сработало и вместо этого вернуло мне только столбец table_name.

Затем я использовал show tables и сохранил вывод в другой таблице с именем table_list, затем я выполнил следующий запрос

select name from (select table_name from table_list) as abc

Это также вернуло мне тот же результат, то есть все имена таблиц.

Могу ли я узнать, что я делаю неправильно и как правильно это сделать?

Я использую MySQL 5.4 и хочу написать подзапрос или процедуру или функцию исключительно в mysql.

Ответы [ 2 ]

2 голосов
/ 22 июля 2009

Существуют PREPARE и EXECUTE, которые могут запускать оператор sql из пользовательской переменной, поэтому, вероятно, могут использовать что-то похожее (не проверено!)

SET @a = "";

SELECT @a := CONCAT('(select name from ',GROUP_CONCAT(table_name SEPARATOR ') UNION (select name from '),')') FROM information_schema.tables WHERE table_type='BASE TABLE' GROUP BY 1;

PREPARE stmt FROM @a;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

1 голос
/ 22 июля 2009

Вам нужен способ иметь переменные в SQL (так что вы можете сказать select * from $name where $name in (select ...)). SQL не позволяет этого.

Я предлагаю разделить процесс на:

Сначала запустите этот запрос:

select 'select distinct name from ' || table_name || ' union'
from select table_name from table_list

Это даст вам выбор для запуска. Поместите их в небольшой скрипт, удалите последний «союз» и запустите этот скрипт.

[EDIT] Если MySQL поддерживает оператор «eval» в хранимых процедурах (то есть, где вы можете построить SQL из частей, а затем запустить его), вы можете сделать это. Я проверил документы, и не похоже, что есть eval. Вы также можете написать расширение на C (см. глава 22 * ​​1012 *), в котором реализована функция поиска или функция eval.

Но я предполагаю, что ваша база данных не будет постоянно меняться. Таким образом, наиболее простым решением было бы написать небольшой сценарий SQL, который создает код для представления (это строка; фактически это представление не создает представление). Каждый раз, когда изменяется база данных, вы просто запускаете сценарий, чтобы воссоздать представление, а затем можете выполнить запрос к представлению, чтобы получить список всех имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...