2013-01-05 20 views
1

我有一个相当复杂的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; 
} 
+0

你说的这样做节省?要计算出将受到影响的行数,必须执行查询。如果这是可能的,你需要执行两次。 –

+1

通过将此重构为单个表删除语句,您将会更好。 – mvp

+0

我希望使用限制查询的循环来在每次传递时说10000行,并在执行时向用户输出状态。 – compcentral

回答

2

你可以简单地尝试这个办法:

SELECT * FROM parts p 
LEFT JOIN binaries b ON b.ID = p.binaryID AND b.procstat IN (4, 6) 
LEFT JOIN releasenfo rn ON rn.binaryID = b.ID 
WHERE rn.binaryid IS NULL OR (rn.binaryid IS NOT NULL AND rn.nfo IS NOT NULL) OR 
     b.dateadded < '2013-01-04 22:01:17' - INTERVAL 36 HOUR; 

DELETE p, b FROM parts p 
LEFT JOIN binaries b ON b.ID = p.binaryID AND b.procstat IN (4, 6) 
LEFT JOIN releasenfo rn ON rn.binaryID = b.ID 
WHERE rn.binaryid IS NULL OR (rn.binaryid IS NOT NULL AND rn.nfo IS NOT NULL) OR 
     b.dateadded < '2013-01-04 22:01:17' - INTERVAL 36 HOUR; 
+0

这给出了一个错误。你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在''或'binaries'附近使用正确的语法..dateadded <'2013-01-04 22:01:17' - 第1行的INTERVAL 36 HOUR LIMIT 0,30' – compcentral

+0

extra “)”。似乎工作。 SELECT COUNT(*)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和rn.nfo IS NOT NULL))或binaries.dateadded <'2013-01-04 22:01:17' - INTERVAL 36 HOUR; – compcentral

+0

更新您的删除查询,它也有额外的“)” –