我有一个名为 mySQL 的数据库listDB
,其中包含多个具有列名Product
等的表。我想SELECT
从 Product Like %XYZ% 的所有表中获取,并在单独的表中显示搜索结果。
我试过这个:
SELECT * FROM * WHERE Product LIKE %XYZ%
但它不起作用。为此目的,正确的查询是什么?
您可以使用以下语句获取包含列产品的所有表:
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('Product')
AND TABLE_SCHEMA='YourDatabase';
然后您必须在这些表上运行光标,以便每次选择:
Select * from OneTable where product like '%XYZ%'
结果应该输入到第三个表或视图中,看看这里。
注意:这只有在所有表的结构相似的情况下才有效,否则 aou 将必须查看所有这些表的哪些列是联合的,并创建您的结果表/视图以仅包含这些列。
SELECT product FROM Your_table_name WHERE Product LIKE '%XYZ%';
上面的语句将显示单个表的结果。如果要添加更多表,只需使用 UNION 语句。
SELECT product FROM Table_name_1
WHERE Product LIKE '%XYZ%'
UNION
SELECT product FROM Table_name_2
WHERE Product LIKE '%XYZ%'
UNION
SELECT product FROM Table_name_3
WHERE Product LIKE '%XYZ%'
... 等等
为什么您不只是转储 mysql 数据库,而是在没有 --single-transaction 的情况下运行时扩展,您将中断与其他客户端的连接:
mysqldump --host=hostname.de --port=0000 --user=username --password=password --single-transaction --skip-add-locks --skip-lock-tables --default-character-set=utf8 datenbankname > mysqlDBBackup.sql
之后读出文件并搜索你想要的......在字符串中......
正如 Suhel Meman 在评论中所说:
SELECT column1, column2, column3 FROM table 1
UNION
SELECT column1, column2, column3 FROM table 2
...
会工作。
但是你所有的SELECTS
都必须包含相同数量的列。并且因为您在一个结果表中显示它,所以它们应该包含相同的信息。
您可能想要做的是在产品 ID 上加入 JOIN 或类似的东西。这样你会得到更多的列,这在大多数情况下更有意义。
改进为@inno 答案
delimiter //
DROP PROCEDURE IF EXISTS get_product;
CREATE PROCEDURE get_product()
BEGIN
DECLARE i VARCHAR(100);
DECLARE cur1 CURSOR FOR SELECT DISTINCT table_name FROM information_schema.columns WHERE COLUMN_NAME IN ('Product');
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO i;
SELECT i; -- printing table name
SET @s = CONCAT('select * from ', i, ' where Product like %XYZ%');
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END LOOP read_loop;
CLOSE cur1;
END//
delimiter ;
call get_product();
您可以从 information_Schema.columns 获取所有具有“产品”列的表
SELECT DISTINCT table_name FROM information_schema.columns WHERE column_name ="Product";
也不创建程序
delimiter //
CREATE PROCEDURE curdemo()
BEGIN
DECLARE a varchar(100);
DECLARE cur1 CURSOR FOR SELECT DISTINCT table_name FROM information_schema.columns WHERE column_name ="Product";
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO a;
SELECT * FROM a;
END LOOP;
CLOSE cur1;
END;
delimiter ;
call curdemo();