Php 使用多个内部联接
我有四张桌子:Php 使用多个内部联接,php,mysql,sql,join,Php,Mysql,Sql,Join,我有四张桌子: 用户,订单,订单与产品和产品。 它们通过外键相互连接 用户表包含:id、name、email和username 产品表包含:id、product\u name、product\u description和product\u price 订单表包含:id,u\u id(外键) 订单产品表包含:id,产品id(外键),订单id(外键) 现在,我正试图获取一个用户的名字和他下的特定订单的总价 我能得到的最大值是这样的: SELECT prod.order_id, SUM(
用户
,订单
,订单与产品
和产品
。
它们通过外键相互连接
用户表包含:id
、name
、email
和username
产品表包含:id
、product\u name
、product\u description
和product\u price
订单表包含:id
,u\u id(外键)
订单产品表包含:id
,产品id(外键)
,订单id(外键)
现在,我正试图获取一个用户的名字和他下的特定订单的总价
我能得到的最大值是这样的:
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;
它向我显示了一个特定订单的总价。现在我有两个问题:
对于一个订单,您的查询是正确的,但可以改进:
- 除非必要,否则不要使用子查询。在MySQL中,这会带来额外的开销
- 您只看到一个订单,它似乎出现在light网站上。您应该删除
子句where
- 您应该使用
,因为您需要聚合分组依据
- 您需要加入用户表以获取名称
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;
嗨,是@Gordon Linoff的新成员 你的问题似乎没问题。
如果您将价格数据存储在订购产品中,这将是一件好事,并带来一些好处,其中一个好处是聚合将非常简单。第二个好处是,如果产品价格发生变化,则不会影响订单 您的SQL是错误的。因为您要计算特定于用户的。但是您的SQL是特定于订单的。您的SQL将给出一个订单的结果。请通过提供用户名或任何唯一的名称使其特定于用户。为什么需要单独的名为orders的表?你可以删除它。你可以添加一些括号吗?。这里有很多内部连接:D。这将是一个很大的帮助。谢谢。@user170654。我可以,但我不会。我发现
from
子句中的括号使查询的意图更难理解。您应该学习如何阅读查询。您可以从第一对表开始,然后继续。然后您可以解释一下查询,因为我发现它很难理解。@user170654。我希望修正查询的编辑能有所帮助。from子句的已被取消。对此我深表歉意。