我有一个相当复杂的DELETE查询,我需要分解成批,但我不能这样做,直到我可以确定在执行查询之前将删除多少行。这里是我想要得到一个计数查询:在删除前,如何获取多表删除查询在mySQL中会影响的行数?
DELETE parts, binaries FROM parts LEFT JOIN binaries ON binaries.ID = parts.binaryID LEFT JOIN releasenfo rn ON rn.binaryID = binaries.ID WHERE binaries.procstat IN (4, 6) AND (rn.binaryid IS NULL OR (rn.binaryid IS NOT NULL AND rn.nfo IS NOT NULL))) OR binaries.dateadded < '2013-01-04 22:01:17' - INTERVAL 36 HOUR;
以下是我认为可能的工作,但它是无效的:
Select COUNT(*) FROM (DELETE parts, binaries FROM parts LEFT JOIN binaries ON binaries.ID = parts.binaryID LEFT JOIN releasenfo rn ON rn.binaryID = binaries.ID WHERE binaries.procstat IN (4, 6) AND (rn.binaryid IS NULL OR (rn.binaryid IS NOT NULL AND rn.nfo IS NOT NULL))) OR binaries.dateadded < '2013-01-04 22:01:17' - INTERVAL 36 HOUR) AS countme;
可有人请点我在正确的方向?
要把它放到背景下,我想用下面的PHP伪代码使用它:
$limit = 10000; // Do in batches to give user status
$totalRows = $db->query("Count query goes here");
while($rowsLeft > 0)
{
echo "$rowsLeft remaining to be deleted\n";
$db->query("DELETE ...... LIMIT ".$limit);
$rowsLeft -= $limit;
}
你说的这样做节省?要计算出将受到影响的行数,必须执行查询。如果这是可能的,你需要执行两次。 –
通过将此重构为单个表删除语句,您将会更好。 – mvp
我希望使用限制查询的循环来在每次传递时说10000行,并在执行时向用户输出状态。 – compcentral