Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL-获取包含特定记录的数据库_Mysql - Fatal编程技术网

Mysql SQL-获取包含特定记录的数据库

Mysql SQL-获取包含特定记录的数据库,mysql,Mysql,所以最初我把它作为一个测试运行 SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema LIKE '%or'; 我环顾四周,找到了显示包含特定表的所有数据库的查询 但是,是否可以让查询进一步执行以下操作: “选择所有在其中包含特定表且在该表中的特定列中包含特定记录的数据库。”?您无法使用SQL语句执行所需操作 但是,您可以使用SQL生成所需的语句。基本声明是: select "tablena

所以最初我把它作为一个测试运行

SELECT DISTINCT table_schema FROM information_schema.columns WHERE table_schema LIKE '%or';
我环顾四周,找到了显示包含特定表的所有数据库的查询

但是,是否可以让查询进一步执行以下操作:


“选择所有在其中包含特定表且在该表中的特定列中包含特定记录的数据库。”?

您无法使用SQL语句执行所需操作

但是,您可以使用SQL生成所需的语句。基本声明是:

select "tablename"
from tablename
where columnname = value
limit 1
请注意,该值周围可能需要有单引号。您可以通过以下方式生成此文件:

select concat('select "', c.table_name, '" ',
              'from ', c.schema_name, '.', c.table_name, ' ',
              'where ', c.column_name, ' = ', VALUE, ' '
              'limit 1'
             )
from information_schema.columns c
where c.table_name = TABLENAME and c.column_name = COLUMN_NAME;
要将所有语句放在一个长SQL语句中,请使用:

select group_concat(concat('select "', c.table_name, '" as table_name',
                           'from ', c.schema_name, '.', c.table_name, ' ',
                           'where ', c.column_name, ' = ', VALUE, ' '
                           'limit 1'
                          ) SEPARATOR ' union all '
                   )
from information_schema.columns c
where c.table_name = TABLENAME and c.column_name = COLUMN_NAME;
然后,我将复制生成的SQL语句并运行它。如果愿意,可以添加
prepare
语句并动态运行它。

例如, 我有一个名为T1的表,其中有列(C1,C2),我正在搜索值'pinder'

这个存储过程所做的是搜索以T开头的表名和以C开头的列,然后循环搜索它们并找到值“pinder”。然后返回表\模式、表\名称、列\名称以及在该列\名称、表\名称、表\模式组合中找到值“针”的次数

看到这个了吗

CREATE PROCEDURE findDatabase(IN in_value varchar(50))
BEGIN
  DECLARE bDone INT;
  DECLARE _TableSchema VARCHAR(50);
  DECLARE _TableName VARCHAR(50);
  DECLARE _ColumnName VARCHAR(50);
  DECLARE curs CURSOR FOR SELECT TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME FROM information_schema.columns WHERE TABLE_NAME LIKE "T%" AND COLUMN_NAME LIKE "C%"; 
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;

  DROP TEMPORARY TABLE IF EXISTS tblResults;
  CREATE TEMPORARY TABLE IF NOT EXISTS tblResults  (
    id int auto_increment primary key,
    tableSchema varchar(50),
    tablename varchar(50),
    columnname varchar(50),
    timesFound int
  );

  OPEN curs;
  SET bDone = 0;
  REPEAT
    FETCH curs INTO _TableSchema,_TableName,_ColumnName;
    SET @found = 0;
    SET @sql = CONCAT("SET @found = (SELECT COUNT(*) FROM ",_TableSchema,".",_TableName,
                      " WHERE ",_ColumnName,"='",in_value,"')");
    PREPARE statement FROM @sql;
    EXECUTE statement;
    IF (@found > 0) THEN
       INSERT INTO tblResults(tableSchema,tableName,columnName,TimesFound) VALUES (_TableSchema,_TableName,_ColumnName,@found);
    END IF;
  UNTIL bDone END REPEAT;

  CLOSE curs;
  SELECT DISTINCT TableSchema,TableName,ColumnName,TimesFound FROM tblResults;
  DROP TABLE tblResults;
END//