Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用多个内部联接_Php_Mysql_Sql_Join - Fatal编程技术网

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子句的
    已被取消。对此我深表歉意。