I have a rather complex DELETE query that I need to break down into batches, but I can’t do that until I can determine how many rows would be deleted before performing the query. Here is the query that I want to get a count on:
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;
Here is what I thought might work, but it’s not valid:
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;
Can someone please point me in the right direction?
To put this into context, I want to use it with the following php pseudo code:
$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;
}
You can simply try this: