假设您有 2 个这样的表:
create table itemid5_1111 (id int, itemname varchar(100));
create table itemid5_2222 (id int, itemname varchar(100));
您将数据插入其中:
insert into itemid5_1111 values (1, 'first table');
insert into itemid5_2222 values (2, 'second table');
您的目标是从所有 itemid5* 表中获得这样的输出。
+------+--------------+
| id | itemname |
+------+--------------+
| 1 | first table |
| 2 | second table |
+------+--------------+
您可以通过键入:
select * from itemid5_1111
union all select * from itemid5_2222;
但是,这需要大量手动输入。可以做一个存储过程动态查询itemid5开头的表名,然后动态创建SQL并执行。
存储过程
delimiter $$
drop procedure if exists get_items$$
create procedure get_items()
begin
declare eof boolean default false;
declare mytable varchar(255);
declare first_run boolean default true;
declare tablenames_cursor cursor for
select table_name from information_schema.tables
where table_name like 'itemid%';
declare continue handler for not found
set eof = true;
set @my_query = '';
open tablenames_cursor;
read_loop: loop
fetch tablenames_cursor into mytable;
if eof then
leave read_loop;
end if;
if first_run then
set @my_query = concat('select * from ', mytable);
set first_run = false;
else
set @my_query = concat(@my_query, ' union all ', 'select * from ', mytable);
end if;
end loop;
close tablenames_cursor;
prepare stmt from @my_query;
execute stmt;
deallocate prepare stmt;
end$$
delimiter ;
你这样调用这个过程来得到你的结果:
call get_items();
如果您像这样创建了第三张表:
create table itemid5_3333 (id int, itemname varchar(100));
insert into itemid5_3333 values (3, 'third table');
然后,你调用 proc,你会得到
call get_items();
+------+--------------+
| id | itemname |
+------+--------------+
| 1 | first table |
| 2 | second table |
| 3 | third table |
+------+--------------+