我有多个具有相同结构但不相关的名称的数据库,我想对所有这些数据库运行此查询:
SELECT FROM <dbname>.`cms_users` WHERE `email` LIKE '%admin.something%'
Run Code Online (Sandbox Code Playgroud)
我在information_schema中搜索了一下,发现了一个名为SCHEMATA包含数据库名称的表,这些名称最终是我运行上述查询所需要的,我可以通过自己替换数据库名称并创建查询来手动完成.但是我想使用mysql循环自动完成它但是我不知道如何才能这样做以及如何将数据库名称连接到查询并运行它.
我的伪代码如下:
array dbnames= select `SCHEMA_NAME` from `information_schema`.`SCHEMATA`;
loop start on dbnames
SELECT FROM dbnames[index].`cms_users` WHERE `email` LIKE '%admin.bilsi%';
loop end
Run Code Online (Sandbox Code Playgroud)
有没有把这个或更好的逻辑放入mysql语法的帮助?谢谢.
SQL Server和其他RDBMS产品允许您在控制台中执行脚本.您可以使用存储过程中可以使用的任何内容.遗憾的是,MySQL更加有限,并且不允许存储过程和函数之外的流控制结构.这意味着没有循环,没有if语句,没有游标.您可以使用变量,但只能使用以变量开头的变量@.
此外,如果您执行循环,则会将多个结果集发送回客户端.如果您只是从控制台运行查询,这很好.如果结果是您打算使用的程序,则可能不合适(在任何一种情况下都可能不合适).
如果您以一种方式执行此操作,请手动获取数据库列表,然后使用复制和粘贴来构建查询UNION ALL,如下所示:
SELECT FROM `first_db`.`cms_users` WHERE `email` LIKE '%admin.bilsi%'
UNION ALL
SELECT FROM `second_db`.`cms_users` WHERE `email` LIKE '%admin.bilsi%'
UNION ALL
SELECT FROM `third_db`.`cms_users` WHERE `email` LIKE '%admin.bilsi%';
Run Code Online (Sandbox Code Playgroud)
如果您希望更改数据库的数量并且不希望更新查询,或者从程序发送数据库,则可以使用动态SQL.这意味着在字符串变量中构建查询,然后使用MySQL的预处理语句功能提交它.
在控制台上,您可以使用类似的内容(请参阅:http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html):
SELECT GROUP_CONCAT(CONCAT("SELECT FROM `", SCHEMA_NAME, "`.`cms_users` WHERE `email` LIKE '%admin.bilsi%'") SEPARATOR ' UNION ALL ')
INTO @stmt_sql
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME NOT IN('mysql', 'test', 'tmp');
PREPARE stmt FROM @stmt_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Run Code Online (Sandbox Code Playgroud)
这将使用INFORMATION_SCHEMA伪数据库中的信息生成上面显示的查询,即按名称列出的数据库列表(MySQL错误地调用模式).其余的只是根据链接文档准备和执行预准备语句所需的样板代码.
还有其他方法,但它们更加乏味,不会给你带来太大的影响.
| 归档时间: |
|
| 查看次数: |
8336 次 |
| 最近记录: |