Как автоматизировать выбор столбца из нескольких таблиц

#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