我必须从一个有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没有将"userTable"视为数据库表——但我试图做的是查询* FROM {tablename}
,其中tablename
是information_schema
的查询结果。
我可以尝试在PHP中进行拆分,尽管我急切地想知道这是否可以在MySQL中实现。
您必须使用prepared语句:
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;
EDIT:您也可以设置SET SESSION group_concat_max_len = 1000000;
,但在SQL中执行所有操作并不是一件容易的事情。您的表列表是一个常量,查询在PHP代码中的位置会更好。
亚当应该得到这笔赏金。如果您愿意,group_concat_max_len
可以被捕获和恢复。你可以把它做得更大。所以我认为没有可靠性问题。我同意不能让表名是一个"变量"。
PHP的等价物类似于:
-
从获取表格列表
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA = 'projectdatabase' AND TABLE_NAME LIKE '%_usertable';
-
根据Adam的建议,构建
UNION
,或者运行50个SELECT
,每个都基于上面列表中的一个表名。然后根据需要组合它们。
建议通过UNION DISTINCT
与UNION ALL
进行思考。