2016-02-04 6 views
5

Ich habe eine kleine Erklärung, die einen Wert dekrementiert:SELECT, UPDATE, DELETE mit einer SQL-Abfrage?

UPDATE cart_items SET quantity = quantity - 1 
WHERE cart_id = {$cart_id} AND id = {$cart_item_id} 

Aber wäre es möglich, für SQL die Zeile zu löschen, wenn dieser Wert 0 nach der Abnahme wird? Wenn ja, möchte ich dann diesen Wagen die Anzahl der Zeilen erzählen passend:

SELECT FROM cart_items WHERE cart_id = {$cart_id} 

Und wenn die Anzahl der Zeilen Null ist, möchte ich diesen Datensatz aus einer anderen Tabelle löschen, etwa so:

DELETE FROM cart WHERE id = {$cart_id} 

Im Moment scheint es notwendig zu sein, mehrere Abfragen zu machen, aber könnte das alles in einer einzigen SQL-Anweisung erledigt werden?

+4

Sie benötigen eine gespeicherte Prozedur. –

+1

Es ist nicht möglich, in einer Abfrage zu tun. – rbedger

Antwort

2

Kurze Antwort ist, dass es nicht möglich ist, die zusätzlichen Abfragen innerhalb eines Triggers oder einer Prozedur zu umhüllen.

Sie können dies in einer Transaktion tun, und ohne SELECT, aber es wird 3 Anfragen nehmen:

START TRANSACTION; 

    UPDATE cart_items 
     SET quantity = quantity - 1 
    WHERE cart_id = {$cart_id} 
     AND id = {$cart_item_id}; 

    DELETE 
     FROM cart_items 
    WHERE quantity = 0 
     AND cart_id = {$cart_id} 
     AND id = {$cart_item_id}; 

    DELETE c 
     FROM cart c 
LEFT JOIN cart_items ci 
     ON ci.cart_id = c.id 
    WHERE c.id = {$cart_id} 
     AND ci.cart_id IS NULL; 

COMMIT; 

Die letzte DELETE Warenkorb auf cart_items verbindet, und löscht den Warenkorb, wenn keine (cart_items Felder gefunden werden sind NULL).

Ich habe verfügbare Identifikatoren enthalten, um die DELETE s zu beschleunigen, obwohl sie in Ordnung sein sollten ohne sie .. es wird nur für andere Menge 0 Gegenstände oder leere Wagen suchen und abholen.

+1

aber es ist keine einzige Abfrage ... –

+0

Nein, aber keine ist eine gespeicherte Prozedur .. es ist nur in einem Anruf abgeschlossen. – Arth

+1

Es kann Lösung sein, aber ich nehme an, es ist nicht genau das, was @daninthemix erwartet ... –

0

Ich denke, dass es nicht möglich ist, all dies in einer Abfrage zu tun, auch wenn Sie Trigger verwenden, da Sie Fehler erhalten werden:

CREATE TABLE cart_items (cart_id int key, quantity int); 
INSERT INTO cart_items VALUES (1, 1), (2, 2); 
-- Create trigger 
delimiter | 
CREATE TRIGGER update_cart_items AFTER UPDATE ON cart_items 
    FOR EACH ROW 
    BEGIN 
    DELETE FROM cart_items WHERE quantity = 0; 
    END; 
| 
delimiter ; 

Und jetzt, wenn Sie Update-Abfrage ausgeführt werden:

UPDATE cart_items SET quantity = quantity - 1 WHERE cart_id = 1; 

Sie werden Fehlermeldung an:

ERROR 1442 (HY000): Can't update table 'cart_items' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

Deshalb habe ich denke, Sie sollten einige Abfragen verwenden ...

Verwandte Themen