Multi-Table-Delete mit MySQL (DELETE und JOIN verknüpfen)
Da ich immer wieder nach dem passenden SQL Statement für ein Multi-Table-Delete suchen und mir dieses mühsam zusammenbasteln muss, poste ich das doch einfach mal hier:
Folgende Situation soll mit einem SQL Statement gelöst werden:
Tabelle A und B sind verknüpft. Bestimmte Inhalte aus Tabelle A sollen gelöscht werden, jedoch nur jede Zeilen, wo in Tabelle B bestimmte Kriterien erfüllt sind:
DELETE FROM
a
USING
item_relations AS a
INNER JOIN
item_main AS b
ON(
a.item_id = b.item_id
AND b.seller_id = 22
AND b.condition_id = 10
)
WHERE
a.relation_id = 25
Spezialfall:
Aus Tabelle A sollen alle Einträge zu einem Artikel gelöscht werden, wenn es insgesamt mehr als 100 Einträge zu dem Artikel in Tabelle A gibt. Hier soll also mittels Subselect auf die selbe Tabelle zugegriffen werden, aus der auch gelöscht werden soll. Da MySQL diese aber nicht zulässt geht man hier einfach den Weg über eine temporäre Tabelle:
CREATE TEMPORARY TABLE
tmp_0
SELECT
item_id
FROM
item_relations AS a
WHERE
a.relation_id = 25
GROUP BY
item_id
HAVING
COUNT(*) > 100
;
DELETE FROM
a
USING
item_relations AS a
INNER JOIN
tmp_0 AS b
ON(
a.item_id = b.item_id
)
WHERE
a.relation_id = 25
;
Spezialfall 2:
MySQL legt in dem vorigen Beispiel keine Indizes an. Wenn es um große Datenmengen geht, sollte daher vorher selbst eine temporäre Tabelle angelegt und gefüllt werden (in diesem Fall natürlich übertrieben):
CREATE TEMPORARY TABLE tmp_0(
`item_id` INT(8) UNSIGNED NOT NULL,
PRIMARY KEY(`id`)
) ENGINE = MYISAM
;
INSERT INTO
tmp_0
SELECT
item_id
FROM
item_relations AS a
WHERE
a.relation_id = 25
GROUP BY
item_id
HAVING
COUNT(*) > 100
;
DELETE FROM
a
USING
item_relations AS a
INNER JOIN
tmp_0 AS b
ON(
a.item_id = b.item_id
)
WHERE
a.relation_id = 25
;