重写我的查询以从select语句中删除

时间:2014-04-22 13:40:31

标签: php mysql

这是我的查询,理论上这将是我想要的,但我知道MySQL不会让你在子选择中使用与删除中相同的表:

DELETE FROM manifestPallet WHERE palletID IN 
( SELECT  manifestPallet.palletID 
            FROM manifestPallet
            LEFT JOIN manifestBox
            ON manifestPallet.palletID = manifestBox.palletID
            WHERE manifestBox.palletID IS NULL)

我知道我可以先进行选择,然后在我的php脚本中循环结果并删除查询,但我认为使用纯MySQL可能有更优雅的解决方案。

额外信息: 查询的作用是从清单中删除托盘,这些托盘是空的。用户创建托盘然后在其上放置盒子,如果他们创建托盘但不在其上放置任何盒子,则在清单关闭时需要移除托盘。

3 个答案:

答案 0 :(得分:4)

DELETE manifestPallet
FROM   manifestPallet LEFT JOIN manifestBox USING (palletID)
WHERE  manifestBox.palletID IS NULL

答案 1 :(得分:0)

您只需指定要应用DELETE的表。

仅删除manifestPallet行:

DELETE `manifestPallet` FROM `manifestPallet` LEFT JOIN `manifestBox` ....

删除manifestPallet和manifestBox行:

DELETE `manifestPallet`, `manifestBox` FROM `manifestPallet` LEFT JOIN `manifestBox` ....

仅删除manifestBox行:

DELETE `manifestBox` FROM `manifestPallet` LEFT JOIN `manifestBox` ....

答案 2 :(得分:0)

DELETE FROM manifestPallet mp
WHERE NOT EXISTS (
    SELECT *
    FROM manifestBox mbx
    WHERE mp.palletID = mbx.palletID
    );

注意:原始查询存在语义差异,因为IN( subselect)术语会删除NULL(和重复项)。 这可能不会导致实际结果的不同,因为palletID可能是一个NOT NULLable(主)键。