来自 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} 其中 tablenameinformation_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 等价物会是这样的:

  1. 获取表格列表
    SELECT TABLE_NAME
       FROM INFORMATION_SCHEMA.tables 
       WHERE TABLE_SCHEMA = 'projectdatabase'   
                AND TABLE_NAME LIKE '%_usertable';
    
  2. 要么构建 UNION,Adam 的建议,要么构建 运行 50 个 SELECT,每个都基于上面列表中的一个表名。然后根据需要组合它们。

建议考虑 UNION DISTINCTUNION ALL