首页 > 解决方案 > 如何查询具有相同结构的多个数据库的同一张表并将所有查询结果放在一起?

问题描述

我有几个数据库都具有相同的结构(相同的表,每个表的相同字段)。

| sword_0            |
| sword_1            |
| sword_2            |
| sword_3            |
| sword_4            |
| sword_5            |
| sword_6            |
| sword_7            |
| sword_8            |
| sword_9            |
+-------------------+
| Tables_in_sword_5 |
+-------------------+
| t_attr            |
| t_basics          |
| t_data            |
| t_equip           |
| t_friend          |
| t_mail            |
| t_resources       |
| t_union           |
| t_union_member    |
+-------------------+

我需要做的是(我先做use sword_5;,然后):

select tba.rid from (
    select rid from t_basics where online_time <= (create_time + 259200)
) as tba
inner join
(select * from t_attr where type = 1000002 and heroLv >= 300) as tbb
on tba.rid = tbb.rid;

所以问题是我不想在每个数据库(use sword_0; use sword_1;....)之间切换并粘贴相同的查询,然后手动复制所有查询结果。

有没有一种方法可以循环所有数据库并一次获取所有结果?(在所有这些数据库rid中是独一无二的)。sword_*

标签: mysqlsql

解决方案


您不需要use ...每个数据库。只需在表前加上数据库名称和UNION/或UNION ALL查询(https://dev.mysql.com/doc/refman/8.0/en/union.html):

SELECT rid FROM sword_0.t_basics
UNION ALL
SELECT rid FROM sword_1.t_basics
UNION ALL
SELECT rid FROM sword_2.t_basics

ETC...

要回答您的评论,是的,可以使用准备好的语句更动态地执行此操作。这是一个简单的例子:

# group_concat_max_len is usually set to 1024, too low!
SET @@group_concat_max_len = 1000000;
# create your query as a string and assign it to a variable
SET @queryString = (
    SELECT GROUP_CONCAT(
        CONCAT('SELECT rid FROM `', s.SCHEMA_NAME, '`.basics')
        SEPARATOR ' UNION ALL '
    )
    FROM information_schema.SCHEMATA s
    WHERE s.SCHEMA_NAME LIKE 'sword%'
);

# prepare, execute and deallocate your statement
# https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html
PREPARE stmt FROM @queryString;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

推荐阅读