我正在使用PHP和MySQL。我需要进行查询:
DELETE FROM db1.players WHERE acc NOT IN (SELECT id FROM db2.accounts)
问题是,db1和db2位于不同的服务器上。这种问题的最快解决方案是什么?
准确地说:我正在使用2个连接,所以我认为我不能使用一个查询。
答案 0 :(得分:5)
答案 1 :(得分:1)
我不知道它是否是最快的,但我会在包含帐户ID的db2上创建一个临时表,将该表导出到db1并在那里运行查询。
对于导出部分,您可以使用mysql内置导出/导入功能,您必须考虑查找未使用的表名或使用CSV - export / import的mysql。
如果内部查询的预期结果数量相当小,您可以使用字符串从PHP内部进行传输:
$ids = query($db1, "SELECT GROUP_CONCAT(id) FROM accounts");
query($db2, "DELETE FROM players WHERE acc NOT IN ($ids)");
答案 2 :(得分:0)
语法database.table.field
实际上应该在MySQL中有效。
但我猜你要直接在MySQL服务器上运行查询。不确定。
您是否尝试过以下操作?
DELETE FROM db1.players WHERE db1.players.acc NOT IN (SELECT db2.accounts.id FROM db2.accounts)
或者我错了,两个数据库不在同一台服务器上? 看看这里:http://www.dottedidesign.com/node/14
答案 3 :(得分:0)
我会尝试类似的事情:
<?php
$pdoRemote = new PDO('mysql:host=somewhere.else;dbname=foo', '...', '...');
$pdoRemote->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdoLocal = new PDO('mysql:host=localhost;dbname=bar', '...', '...');
$pdoLocal->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdoLocal->exec('CREATE TEMPORARY TABLE remoteIds ( id int )'); // maybe engine=heap
$stmtLocal = $pdoLocal->prepare('INSERT INTO remoteIds (id) VALUES (:id)');
$stmtLocal->bindParam(':id', $id);
foreach( $pdoRemote->query('SELECT id FROM accounts') as $row ) {
$id = $row['id'];
$stmtLocal->execute();
}
unset($pdoRemote);
答案 4 :(得分:0)
要使用单个查询在不同服务器上查询多个数据库,您可以使用federated tables。
您还可以使用复制或临时表。这样就可以访问同一台服务器上的数据库了。
我能想到的唯一其他选择是使用MySQL Proxy将您的查询解析为2个或更多查询。
我认为我说你不能按照使用sp_addlinkedserver
程序使用MSSQL的方式来做到这一点。
使用两个查询可能会更好。