我有这个数据库架构:
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)
);
我正在尝试编写一个查询,它将为我提供用户和产品的所有组合,以及用户在该产品上花费的总金额。具体来说,如果我有5个产品和5个用户,表中应该有25行。现在我有一个几乎可以完成工作的查询,但是,如果用户从未购买过该产品,那么根本就没有打印行。
这是我到目前为止所写的内容:
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
我认为这需要某种联接,但我的SQL知识有限,我不确定这样做的最佳方法是什么。我想如果有人可以帮我解决这个问题,那么我会有更好的理解。
答案 0 :(得分:1)
您可以使用cross join
和left join
:
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;
cross join
生成所有行。 left join
引入匹配的行。使用SQL时的一个简单规则是:从不在FROM
子句中使用逗号。 始终使用明确的JOIN
语法。