来自 Table 的查询,源自 Information_Schema.Tables 结果
Query from a Table, That's derived from a Information_Schema.Tables Result
我不得不从一个拥有超过 50 个 table 的数据库中进行查询 - 所有这些都具有相同的结构(我知道,来自已投入生产超过 5 年的遗留项目的可怕数据库设计!)。为此,我查询了 information_Schema
,如下所示:
SELECT
TABLE_NAME
FROM
INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA =
'projectdatabase'
AND
TABLE_NAME LIKE '%_usertable'
结果,它为我提供了我需要的 50 个左右 table。现在,我需要从每个 table 中查询列,例如 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' 视为数据库 table - 但我正在尝试做的是查询 * FROM {tablename}
其中 tablename
是 information_schema
查询结果。
我可以尝试在 PHP 中拆分它,尽管我急切地想知道这是否有可能在 MySQL 中完成。
你必须使用预处理语句:
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 中完成所有操作并不是一件好事。您的 table 列表是一种常量,查询将位于您的 PHP 代码中更好的位置。
Adam 值得赏金。 group_concat_max_len
可以根据需要捕获和恢复。你可以把它做得更大。所以我没有看到可靠性问题。我同意你不能让表名成为 'variable'.
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
。
我不得不从一个拥有超过 50 个 table 的数据库中进行查询 - 所有这些都具有相同的结构(我知道,来自已投入生产超过 5 年的遗留项目的可怕数据库设计!)。为此,我查询了 information_Schema
,如下所示:
SELECT
TABLE_NAME
FROM
INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA =
'projectdatabase'
AND
TABLE_NAME LIKE '%_usertable'
结果,它为我提供了我需要的 50 个左右 table。现在,我需要从每个 table 中查询列,例如 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' 视为数据库 table - 但我正在尝试做的是查询 * FROM {tablename}
其中 tablename
是 information_schema
查询结果。
我可以尝试在 PHP 中拆分它,尽管我急切地想知道这是否有可能在 MySQL 中完成。
你必须使用预处理语句:
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 中完成所有操作并不是一件好事。您的 table 列表是一种常量,查询将位于您的 PHP 代码中更好的位置。
Adam 值得赏金。 group_concat_max_len
可以根据需要捕获和恢复。你可以把它做得更大。所以我没有看到可靠性问题。我同意你不能让表名成为 'variable'.
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
。