我有四张桌子:
users
,orders
,orders_product
和products
。
它们通过外键相互连接
用户表包含:id
,name
,email
和username
。
产品表包含:id
,product_name
,product_description
和product_price
订单表包含:id
,u_id(foreign key)
。
orders_product表包含:id
,product_id(foreign key)
,order_id(foreign key)
。
现在我试图以他所放置的特定订单的总价格来获取用户的名称。
我能达到的最大值是这样的:
SELECT prod.order_id,
SUM(product_price) AS Total
FROM products
INNER JOIN
(SELECT orders.id AS order_id,
orders_product.product_id
FROM orders
INNER JOIN orders_product ON orders.id = orders_product.order_id
WHERE order_id=1) AS prod ON products.id = prod.product_id;
它显示了特定订单的总价。现在我有两个问题:
该查询是否正确。它看起来像一个很长的查询。使用较小的结果可以获得相同的结果吗?
如何使用已放置的特定订单的总价来获取用户的名称。
答案 0 :(得分:1)
您的查询对于一个订单是正确的,但可以改进:
where
条款。group by
,因为您需要聚合。我还添加了表别名(表名的缩写)。这使查询更具可读性:
SELECT u.name, SUM(p.product_price) as Total
FROM orders_product op INNER JOIN
orders o
ON o.id = op.order_id INNER JOIN
products p
ON p.id = op.product_id INNER JOIN
users u
on o.userid = u.id
WHERE op.order_id = 1
GROUP BY u.name;
答案 1 :(得分:1)
你好@Gordon Linoff的一些补充 你的查询似乎没问题。 如果您将价格数据存储在order_products中,那将是好的和一些好处,其中一个好处是聚合将很简单。第二个好处,如果产品价格变化,它不会影响订单。
答案 2 :(得分:0)
你的SQL错了。因为您想要特定于用户计算。但是您的SQL特定于Order。您的SQL将为One Order提供结果。请通过提供用户名或用户名来使其成为用户特定的。