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
;

Das könnte dich auch interessieren …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Bitte beachte die Hinweise zum Datenschutz