MySQL - Summe vom Warenkorb ermitteln

proloser

Erfahrenes Mitglied
Hallo,

sorry wegen dem Doppelpost aber ich habe das andere Thema schon auf "erledigt" gesetzt und desshalb erhalte ich keine Antworten mehr auf das Thema.

Ich habe ein Problem beim ermitteln der Gesamtsumme von meinem Warenkorb.

Die Tabelle für den Warenkorb:

id | product_id | quantity | ip
1 | 4 | 1 | 11.222.33.444
2 | 5 | 2 | 11.222.33.444
3 | 6 | 2 | 11.222.33.444


Die Tabelle für meine Produkte:

id | name | price
4 | Laptop | 500
5 | PC | 1000
6 | Tasche | 50


Im Warenkorb befindet sich jetzt:

2 X PC - 2000 EUR
1 X Laptop - 500 EUR
2 X Tasche - 100 EUR

Der Gesamtbetrag wär somit 2600 EUR.


Das ganze funktioniert auch einwandfrei aber nur wenn das erste Produkt (in diesem Fall mit der ID 4) im Warenkorb enthalten ist.

SQL:
SELECT 
    a.*, b.*, SUM(a.price * b.quantity) AS total
  FROM 
    product a
  
  LEFT JOIN 
    cart b 
  
  ON  
    a.id = b.product_id
    
  HAVING
    b.insert_ip = '$ip'

Kann mir jemand sagen warum das so ist und wie ich das Problem lösen kann?

Gruß proloser
 
Zuletzt bearbeitet von einem Moderator:
Hallo proloser,

vorneweg: du kannst ein Thema auch wieder als unerledigt markieren, indem du nochmals auf den Haken klickst. Wenn das nicht funktionieren sollte, dann ist das ein Bug (den du bei Bedarf auch melden könntest).

Zu deinem Problem: du selektierst sämtliche Produkte und suchst dir dazu die Warenkorbeinträge zusammen (falls vorhanden). Sinnvoller wäre es, alle Produkte eines Warenkorbes zu selektieren und die entsprechenden Einträge in der Produktetabelle zusammenzusuchen. Die SUM-Funktion ist außerdem ohne „GROUP BY“-Klausel wirkungslos. HAVING musst du nur verwenden, wenn du Bedingungen auf Aggregatsfunktionen festlegen willst. Im Klartext:
SQL:
SELECT c.*, p.*, a.price * b.quantity AS total
FROM cart c
LEFT JOIN  product p ON (c.product_id = p.id)
WHERE c.insert_ip = '$ip'

Grüße,
Matthias
 
Vornweg: Das Beispielresultat stimmt nicht mit der Tabelle überein.
Es währe laut Beispiel
1 X Laptop - 500 EUR
2 X PC - 2000 EUR
2 X Tasche - 100 EUR
Total 2600€

Nun zum Query
Du hast dein JOIN falsch aufgebaut.
Momentan nimmst du alle Produkte und hängst die Einkäufe an. Wenn ein Produkt nicht gekauft wird, hast du b.quantity als NULL.
Du hast folgende Möglichkeiten
1) du änderst dein LEFT JOIN zu einem INNER JOIN (also nimmt er nur Produkte die in beiden Tabellen vorhanden sind)
2) du lässt das JOIN ganz weg und verknüpfst über WHERE. Das hat dieseleb Auswikrung wie 1)
3) du gehtst vom Einkaufskorb mit dem LEFT JOIn auf die Produkte. Also cart LEFT JOIN product

item: ich würde die IP-Abfrage als Subquery machen. In deinem Beispiel verknüpfst du immer alle Einkäufe mit den Produkten. Das geht bei wenigen Einkäufen gut, jedoch bei vielen wird das langsam

item: SUM ohne GROUP BY macht wenig Sinn. In einem GROUP BY alle Felder ausgeben macht auch wenig Sinn.

SQL:
SELECT 
    b.insert_ip, 
    SUM(a.price * b.quantity) AS total
FROM 
    product a,
    (SELECT * FROM cart WHERE insert_ip = '$ip') b 
WHERE
    a.id = b.product_id
GROUP BY
    b.insert_ip
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

die Abfrage kannst du relativ einfach gestalten:
SQL:
SELECT 
  SUM(price * quantitiy) AS total
FROM
  product AS p JOIN cart AS c ON p.id = c.product_id
WHERE
  c.ip = '$ip'

Somit sollte er alles richtig zusammenrechnen und dann die Gesamtsumme zurückgeben.

Gruß
BK
 
Zuletzt bearbeitet von einem Moderator:
Zurück