#mysql #database #redash
Вопрос:
У меня есть несколько столов, по крайней мере, 26 … я пытаюсь выбрать столбец из всех таблиц и отобразить их как один
я попробовал это :
(SELECT col1,col2,col3,col4 FROM table1 ORDER BY col1 DESC LIMIT 1) UNION (SELECT col1,col2,col3,col4 FROM table2 ORDER BY col1 DESC LIMIT 1)
это работает, но мне приходится копировать и вставлять кучу раз в зависимости от того, сколько у меня таблиц, что не очень эффективно . Пожалуйста, помогите-я только начал изучать mysql и застрял, пытаясь это исправить.
Комментарии:
1. Вероятно, в вашем дизайне базы данных есть что-то нетрадиционное. Почему у вас вообще 6 столов? Я предполагаю, что это может быть разработано с помощью одного стола вместо этого.
Ответ №1:
Вы можете сделать это с помощью курсора внутри хранимой процедуры, например:
CREATE DEFINER=`homestead`@`%` PROCEDURE `union_tables`() LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '' BEGIN DECLARE done INT DEFAULT FALSE; DECLARE tablename VARCHAR(100); DECLARE tableschema VARCHAR(100); DECLARE sql_union_tables TEXT; DECLARE tables_cursor CURSOR FOR SELECT TABLE_NAME, TABLE_SCHEMA FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = 'DbInscripciones' AND TABLE_NAME LIKE 'TblFaltasA%'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN tables_cursor; SET sql_union_tables = ''; read_loop: LOOP FETCH tables_cursor INTO tablename, tableschema; IF done THEN LEAVE read_loop; END IF; IF sql_union_tables = '' THEN SET sql_union_tables = CONCAT('(SELECT numcontrol FROM ', tableschema, '.', tablename, ' LIMIT 1)'); ELSE SET sql_union_tables = CONCAT(sql_union_tables, ' UNION ALL (SELECT numcontrol FROM ', tableschema, '.', tablename, ' LIMIT 1)'); END IF; END LOOP; CLOSE tables_cursor; SET sql_union_tables = CONCAT(sql_union_tables, ';'); PREPARE stmt FROM sql_union_tables; EXECUTE stmt; SELECT sql_union_tables; END
Давайте объясним это по частям. Вы получаете список желаемых имен таблиц, запрашивая information_schema
базу данных, и tables_cursor
курсор позволит вам выполнить итерацию по этому списку таблиц.
В части итерации вы создаете запрос, используя таблицы, полученные из запроса курсора, и сохраняете его sql_union_tables
.
После завершения построения запроса вы выполняете его с PREPARE
EXECUTE
помощью операторов and, а также возвращаете полученный запрос (последняя строка).
Эта хранимая процедура предполагает, что в ваших таблицах есть одни и те же столбцы. Если ваши столбцы различаются для каждой таблицы, вам придется реализовать некоторую логику, чтобы справиться с этим.
После этого вы вызываете хранимую процедуру следующим образом:
CALL union_tables