Query and get all database names and subquery especific tables from all databases

谁都会走 提交于 2020-01-06 07:01:17

问题


I have different databases. I have tables within each database. I would like to know if I can ask how many databases excluding some such as 'schema' 'mysql' I have once know how to perform a subquery asked by a particular table of all the databases resulting from the first question.

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

its possible in one query

thanks..


回答1:


Here's one way you could do it with a stored procedure.

If I understand correctly, you have multiple databases with identical tables (user) and you want to run a query against all these tables for a specific value.

I've made this fairly general so that you can pass in the table name and also the where clause. Your example seemed to be looking for user records with imei = '76876876', so if we use that example.

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 ;

Run it with

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


来源:https://stackoverflow.com/questions/49830215/query-and-get-all-database-names-and-subquery-especific-tables-from-all-database

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!