从表中查询,这是从Information_Schema.Tables结果派生的

时间:2015-02-12 21:14:03

标签: php mysql subquery information-schema

我必须从具有超过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},其中tablenameinformation_schema查询结果。

我可以尝试在PHP中将其拆分,尽管我非常想知道这是否可以在MySQL中进行。

2 个答案:

答案 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的等价物将类似于:

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

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