場合によります。r と b の間の fk が で指定されているON DELETE CASCADE
場合、次のことができます。
START TRANSACTION;
DELETE FROM b
WHERE id IN (
SELECT r.b_id
FROM r
INNER JOIN a
ON r.a_id = a.id
WHERE <some condition on a>
);
DELETE FROM a
WHERE <some condition on a>;
COMMIT WORK;
カスケード削除がない場合は、一時テーブルを使用して実行できます。
CREATE TEMPORARY TABLE to_be_deleted_from_b
LIKE b;
START TRANSACTION;
INSERT INTO to_be_deleted_from_b
SELECT *
FROM b
INNER JOIN r
ON b.id = r.b_id
INNER JOIN a
ON r.a_id = a.id
WHERE <some condition on a>;
DELETE FROM r
WHERE a_id IN (
SELECT a.id
FROM a
WHERE <some condition on a>
);
DELETE FROM a
WHERE <some condition on a>;
DELETE FROM b
WHERE b.id IN (
SELECT id
FROM to_be_deleted_from_b
);
COMMIT WORK;
DROP TABLE to_be_deleted_from_b