Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在删除之前,如何获取多表删除查询在mySQL中影响的行数?_Mysql_Select_Join - Fatal编程技术网

在删除之前,如何获取多表删除查询在mySQL中影响的行数?

在删除之前,如何获取多表删除查询在mySQL中影响的行数?,mysql,select,join,Mysql,Select,Join,我有一个相当复杂的DELETE查询,我需要将其分解为多个批次,但在执行查询之前,我无法确定要删除多少行。下面是我想要计算的查询: 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.binar

我有一个相当复杂的DELETE查询,我需要将其分解为多个批次,但在执行查询之前,我无法确定要删除多少行。下面是我想要计算的查询:

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 * 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;
从零件p中选择*
(4,6)中的b.ID=p.binaryID和b.procstat上的左连接二进制文件b
rn.binaryID=b.ID上的左连接releasefo rn
其中rn.binaryid为NULL或(rn.binaryid不为NULL且rn.nfo不为NULL)或
b、 新增日期<'2013-01-04 22:01:17'-间隔36小时;
从零件p中删除零件p、b
(4,6)中的b.ID=p.binaryID和b.procstat上的左连接二进制文件b
rn.binaryID=b.ID上的左连接releasefo rn
其中rn.binaryid为NULL或(rn.binaryid不为NULL且rn.nfo不为NULL)或
b、 新增日期<'2013-01-04 22:01:17'-间隔36小时;

这样做可以节省什么?要计算出受影响的行数,必须执行查询。如果这是可能的,您需要执行两次。您最好将其重构为单个表delete语句。我希望使用一个循环,将查询限制为每次传递10000行,并在执行时向用户输出状态。这对我来说似乎是一个非常糟糕的主意。只需使用查询进程就可以了。比如什么?我添加了示例代码,这样您就可以了解我在尝试做什么。这可能需要数小时才能完全运行。这会导致错误。您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以了解使用near')或二进制文件的正确语法。dateadded<'2013-01-04 22:01:17'-第1extra行的间隔36小时限制0,30')”。似乎有效。选择COUNT(*)FROM parts LEFT JOIN binaries ON binaries.ID=parts.binaryID LEFT JOIN releasefo rn ON rn.binaryID=binaries.ID,其中binaries.procstat IN(4,6)和(rn.binaryID为NULL或(rn.binaryID不为NULL且rn.info不为NULL))或binaries.dateadded<'2013-01-04 22:01:17'-间隔36小时;更新你的删除查询,它也有额外的“)”从你的查询中删除额外的括号
$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;
}   
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;