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 ;