2016-05-23 9 views
0

ich dieses Datenbankschema haben:eine Abfrage schreiben zu kombinieren Ergebnisse aus mehreren Tabellen mit allen möglichen Kombinationen

CREATE TABLE users (
    id SERIAL PRIMARY KEY, 
    name char(50) NOT NULL UNIQUE 
); 

CREATE TABLE products (
    id SERIAL PRIMARY KEY, 
    name char(50) NOT NULL, 
); 

CREATE TABLE orders (
    id SERIAL PRIMARY KEY, 
    uid INTEGER REFERENCES users (id) NOT NULL, 
    pid INTEGER REFERENCES products (id) NOT NULL, 
    quantity INTEGER NOT NULL, 
    price FLOAT NOT NULL CHECK (price >= 0) 
); 

Ich versuche, eine Abfrage zu schreiben, die mir alle Kombinationen von Benutzern und Produkte geben wird, sowie der Gesamtbetrag, den der Benutzer für dieses Produkt ausgegeben hat. Insbesondere wenn ich 5 Produkte und 5 Benutzer habe, sollte es 25 Zeilen in der Tabelle geben. Im Moment habe ich eine Abfrage, die fast die Arbeit erledigt, aber wenn der Benutzer dieses Produkt noch nie gekauft hat, dann wird überhaupt keine Zeile gedruckt.

Hier ist, was ich bisher geschrieben habe:

SELECT u.name as username, p.name as productname, SUM(o.quantity * o.price) as totalPrice 
FROM users u, orders o, products p 
WHERE u.id = o.uid 
AND p.id = o.pid 
GROUP BY u.name, p.name 
ORDER BY u.name, p.name 

Ich vermute, dass dies eine Art von Join erfordert, aber mein SQL Wissen ist begrenzt, und ich bin nicht sicher, was der beste Weg wäre, um zu gehen Dies tun. Ich denke, wenn jemand mir helfen kann, das herauszufinden, dann werde ich ein viel besseres Verständnis haben.

+0

mysql! = Postgresql – shmosel

+0

Ihr SQL-Dialekt sieht wie Postgres aus, also habe ich das MySQL-Tag entfernt. –

+0

Sie müssen einen CROSS JOIN erstellen und dann das Ergebnis LEFT mit Ihrer Tabelle verknüpfen. –

Antwort

1

Sie können diese cross join und left join mit tun:

select u.name as username, p.name as productname, 
     sum(o.quantity * o.price) as totalPrice 
from users u cross join 
    products p left join 
    orders o 
    on o.uid = u.id and o.pid = p.id 
group by u.name, p.name; 

Die cross join erzeugt alle Zeilen. Die left join bringt die passenden Zeilen ein. Eine einfache Regel bei der Verwendung von SQL ist: Nie Kommas in der FROM Klausel verwenden. Immer verwenden explizite JOIN Syntax.

+0

@miladmaaan. . . Sie sollten das als eine andere Frage stellen. –

Verwandte Themen