从表中查询,That';s派生自Information_Schema.Tables结果


Query from a Table, That's derived from a Information_Schema.Tables Result

我必须从一个有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},其中tablenameinformation_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的等价物类似于:

  1. 从获取表格列表

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

建议通过UNION DISTINCTUNION ALL进行思考。