【问题标题】:Query and get all database names and subquery especific tables from all databases从所有数据库中查询并获取所有数据库名称和子查询特定表
【发布时间】:2018-04-14 09:57:44
【问题描述】:

我有不同的数据库。我在每个数据库中都有表。 我想知道我是否可以询问有多少数据库不包括诸如“模式”“mysql”之类的数据库我曾经知道如何执行由第一个问题产生的所有数据库的特定表询问的子查询。

example.
the structure would be
db1 -> user-> id,name,imei,telephone,etc..
db2 -> user-> id,nameuser,imei,telephone,etc..
db3 -> user-> id,nameuser,imei,telephone,etc..
....
db1000 -> user-> id,nameuser,imei,telephone,etc..

the query are how this, but this get error

    SELECT CONCAT('SELECT * FROM ' schema_name 'where imei.'schema_name =     nameimai)
    FROM information_schema.schemata
    WHERE schema_name NOT IN ('information_schema','mysql','performance_schema','sys','performance_schema','phpmyadmin');

    Results

    name db    id          name       imei        phone
    ---------- ---------- ---------- ---------- ----------
    db1         1            John     76876876  xxx
    db2         2300         John     76876876   xxxx  
    ...
    db1000       45          John     76876876   xxx

一次查询即可

谢谢..

【问题讨论】:

    标签: subquery concat multiple-databases


    【解决方案1】:

    这是您可以使用存储过程执行此操作的一种方法。

    如果我理解正确,您有多个具有相同表(用户)的数据库,并且您希望针对所有这些表运行查询以获取特定值。

    我已经把它做得相当笼统,这样你就可以传入表名和 where 子句。您的示例似乎正在查找带有 imei = '76876876' 的用户记录,所以如果我们使用该示例。

    USE test;
    
    DELIMITER //
    DROP PROCEDURE IF EXISTS multidb_select //
    -- escape any quotes in the query string
    -- call multidb_select ('usertest','WHERE imei = \'76876876\'')
    CREATE PROCEDURE multidb_select(IN tname VARCHAR(64), IN qwhere VARCHAR(1024))
      READS SQL DATA
    BEGIN
      DECLARE vtable_schema VARCHAR(64);
      DECLARE vtable_name VARCHAR(64);
    
      DECLARE done BOOLEAN DEFAULT FALSE;
      -- exclude views and system tables
      DECLARE cur1 CURSOR FOR 
        SELECT `table_schema`, `table_name`
        FROM `information_schema`.`tables`
        WHERE `table_name` = tname
        AND `table_type` = 'BASE TABLE'
        AND `table_schema` NOT IN 
          ('information_schema','mysql','performance_schema',
           'sys','performance_schema','phpmyadmin')
        ORDER BY `table_schema` ASC;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;
    
      OPEN cur1;
      SET @unionall := '';
    
      read_loop: LOOP
        FETCH cur1 INTO vtable_schema, vtable_name;
        IF done THEN
          LEAVE read_loop;
        END IF;
    
        -- UNION ALL in case the id is the same  
        IF CHAR_LENGTH(@unionall) = 0 THEN
          SET @unionall = 
            CONCAT("SELECT \'", vtable_schema , "\' AS 'Db', t.* FROM `", 
                    vtable_schema, "`.`" , vtable_name, "` t ", qwhere);
        ELSE
          SET @unionall = 
            CONCAT(@unionall, " UNION ALL SELECT \'", vtable_schema , 
                    "\' AS 'Db', t.* FROM `", vtable_schema, 
                    "`.`", vtable_name, "` t ", qwhere);
        END IF;  
    
      END LOOP;
      CLOSE cur1;
    
      PREPARE stmt FROM @unionall;
      EXECUTE stmt;   
      DEALLOCATE PREPARE stmt;
    
    END //
    
    DELIMITER ;
    

    运行它

    call test.multidb_select('user','WHERE imei = \'76876876\'')
    

    【讨论】:

      猜你喜欢
      • 2011-04-24
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 2020-12-10
      • 2021-12-13
      相关资源
      最近更新 更多