2016-08-05 15 views
0

Also habe ich zwei Tabellen in meinem MySQL, Benutzer und Einkäufe.SQL Select Summe mit mehreren wo aus verschiedenen Tabellen

Benutzer Tabelle enthält ID, Name, Nachname und so weiter. Purchase-Tabelle enthält ID, User_id, Status und Summe für etwas bezahlt.

Was ich brauche, ist, aus diesen zwei Tabellen zu wählen, wo ich die Summe jedes Artikels haben würde, den jeder Benutzer gekauft hat.

Ich habe die ‚Benutzer‘ mit Tisch versucht:

LEFT JOIN 'purchases' 
ON 'users'.'id' = 'purchases'.'user_id' 
SELECT SUM (sum) FROM 'users', 'purchases' WHERE 'purchases'.'status' = 'completed' AND 'purchases'.'user_id' = 'users'.'id' 

Aber damit ich die gleiche Summe für jeden Benutzer erhalten, was falsch ist. Was soll ich stattdessen schreiben?

Würde ich jede mögliche Hilfe sehr schätzen!

einige aktuelle Beispiel liefern, lässt dieses nehmen:

Users: 
Id: 1 Name: John 
Id: 2 Name: Ann 
Purchases: 
Id: 10 Status: completed User_id: 1 Sum: 4.00 
Id: 20 Status: completed User_id: 1 Sum: 8.00 
Id: 30 Status: completed User_id: 2 Sum: 50.00 
Id: 40 Status: completed User_id: 2 Sum: 100.00 

Nach dem Ausführen der Abfrage ich diese bekommen sollte:

Id: 1 Sum: 12.00 
Id: 2 Sum: 150.00 

Die Abfrage wurde über Laravel gemacht, also musste ich nur

+0

einige Beispieltabellendaten hinzufügen, und das erwartete Ergebnis. Zeigen Sie uns auch die ganze Abfrage. – jarlh

+1

Um 'Id: 1 Summe: 12.00 Id: 2 Summe: 150,00' zu erhalten, müssen Sie 'Benutzern' überhaupt nicht beitreten.Sie haben user_id in 'Käufe'. – Serg

+0

Ein Anführungszeichen (') bezeichnet eine Zeichenfolge. Verwenden Sie Backticks ('), um Tabellen-/Spaltenidentifizierer zu bezeichnen. – Strawberry

Antwort

1

Original-Antwort

First off, Ihre eingereichten SQL war ein Chaos, die Dinge waren ganz aus der herkömmlichen Ordnung, ich bin nicht sicher, es würde wie dargestellt auszuführen. Das heißt, sollte das tun, was Sie wollen, vorausgesetzt, ich Ihre gewünschte Ausgabe richtig verstehen:

SELECT users.id, users.name, users.surname, ROUND(SUM(purchases.sum),2) AS totalSum 
FROM purchases 
    LEFT JOIN users ON users.id = purchases.user_id 
WHERE status='completed' 
GROUP BY users.name, users.surname 
ORDER BY users.id 

Der Schlüsselaspekt Sie aus der Abfrage der GROUP BY Abschnitt war fehlte, ich ORDER BY für meinen eigenen Vorteil auf meiner Geige hinzugefügt, benutze es wenn du willst oder nicht.

Hier ist eine Fiddle, die ich vor der Veröffentlichung Ihrer Beispieldaten für Sie vorbereitet habe. Die Hauptantwort wurde von anderen gegeben, die ich sehe. Ich poste das einfach, weil ich bereits daran gearbeitet habe. http://sqlfiddle.com/#!9/8fa2d/6/0

Antwort 2.0

Fiddle so handeln up, ist dies nicht getestet, aber es versuchen.

SELECT users.id, users.name, users.surname, ROUND(SUM(CASE WHEN purchases.status = 'completed' THEN purchases.sum ELSE 0 END),2) AS totalSum 
FROM users 
    LEFT JOIN purchases ON users.id = purchases.user_id 
GROUP BY users.id 
ORDER BY users.id 
+1

@AntDC erwähnt auch einen nützlichen Tipp, der einen Alias ​​für die Tabellen bietet, so dass Sie nicht ständig Käufe und Benutzer eingeben müssen. – JBartus

+0

Diese Abfrage gibt nur die Benutzer zurück, die einige abgeschlossene Käufe abgeschlossen haben, aber ich muss alle mit 0.00 oder null oder was auch immer abrufen, wenn sie keine abgeschlossenen Käufe haben. – Coffee

+0

Ungültige GROUP BY, wird nicht auf neueren MySQL-Versionen ausgeführt. (Die allgemeine GROUP BY-Regel besagt: Wenn eine GROUP BY-Klausel angegeben ist, muss jede Spaltenreferenz in der SELECT-Liste entweder eine Gruppierungsspalte identifizieren oder das Argument einer set-Funktion sein.) – jarlh

0

Sie müssen nach dem Feld gruppieren, auf dem die Aggregate basieren sollen. Ich kenne Ihre Tabellenstrukturen nicht, aber so etwas sollte tun.

SELECT 
    U.UserId, U.UserName, Sum(P.AmountPaid) 
FROM Users U 
LEFT OUTER JOIN Purchases P ON P.UserId = U.UserId AND P.Status = 'completed' 
GROUP BY 
U.UserId, U.UserName 
-1
SELECT columns, SUM(column to sum) 
FROM (tables you want) 
WHERE FILTER 
GROUP BY column (for example customer ID) 

haben Sie legen eine GROUP BY, dass Ihre Datenbank kennt, die Dinge summiert werden.

0

Diese Abfrage:

SELECT 
    U.UserId, Sum(P.AmountPaid) 
FROM Users U 
LEFT OUTER JOIN Purchases P ON P.UserId = U.UserId 
GROUP BY 
U.UserId 
Verwandte Themen