我必须从具有超过50个表的数据库进行查询 - 所有表都具有相同的结构(我知道,来自遗留项目的Horrid数据库设计已经生产了5年以上! )。为此,我查询了information_Schema
,如下所示:
SELECT
TABLE_NAME
FROM
INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA =
'projectdatabase'
AND
TABLE_NAME LIKE '%_usertable'
在结果中,它为我提供了我需要的50个左右的表。现在,我需要查询每个表中的列,例如PRODUCT_ID
。在这样做时,我尝试过:
SELECT
projectdatabase.userTable.PRODUCT_ID
FROM (
SELECT
TABLE_NAME as userTable
FROM
INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA =
'projectdatabase'
AND
TABLE_NAME LIKE '%_usertable'
) AS userTables
现在这显然不起作用,因为MySQL没有对待用户表'作为数据库表 - 但我尝试做的是查询* FROM {tablename}
,其中tablename
是information_schema
查询结果。
我可以尝试在PHP中将其拆分,尽管我非常想知道这是否可以在MySQL中进行。
答案 0 :(得分:5)
你必须使用预备声明:
SET @sql:=(SELECT GROUP_CONCAT(
CONCAT("SELECT PRODUCT_ID FROM ", TABLE_NAME) SEPARATOR " UNION ")
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'projectdatabase'
AND TABLE_NAME LIKE '%_usertable');
PREPARE stmt FROM @sql;
EXECUTE stmt;
编辑:您也可以设置SET SESSION group_concat_max_len = 1000000;
,但在SQL中执行所有操作都不是必须的。您的表列表是一种常量,查询将在您的PHP代码中处于更好的位置。
答案 1 :(得分:0)
group_concat_max_len
。你可以做得更大。所以我没有看到可靠性问题。我同意你不能让表名成为变量'。
PHP的等价物将类似于:
从
获取表格列表SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'projectdatabase'
AND TABLE_NAME LIKE '%_usertable';
构建UNION
,Adam的建议,或运行50 SELECT
个,每个基于上面列表中的一个表名。然后根据需要组合它们。
建议通过UNION DISTINCT
与UNION ALL
进行思考。