使用多个内部联接

时间:2014-04-28 11:07:50

标签: php mysql sql join

我有四张桌子: usersordersorders_productproducts。 它们通过外键相互连接

用户表包含:idnameemailusername

产品表包含:idproduct_nameproduct_descriptionproduct_price

订单表包含:idu_id(foreign key)

orders_product表包含:idproduct_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;

它显示了特定订单的总价。现在我有两个问题:

  1. 该查询是否正确。它看起来像一个很长的查询。使用较小的结果可以获得相同的结果吗?

  2. 如何使用已放置的特定订单的总价来获取用户的名称。

3 个答案:

答案 0 :(得分:1)

您的查询对于一个订单是正确的,但可以改进:

  • 除非必要,否则不要使用子查询。在MySQL中,这会带来额外的开销。
  • 您只看一个订单,这似乎在灯光网站上。您应该删除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提供结果。请通过提供用户名或用户名来使其成为用户特定的。