代码之家  ›  专栏  ›  技术社区  ›  Toma Tomov

Mysql Select查询返回一行两次

  •  1
  • Toma Tomov  · 技术社区  · 7 年前

    SELECT SUM(`sales_order_products`.`quantity`) AS total
          ,SUM(`sales_order`.`total`) AS price
    FROM `sales_order` AS `so`
    LEFT OUTER JOIN `sales_order_products` AS `p` ON `so`.`id` = `p`.`order_id`
    WHERE leasing = 0
    

    sales_order sales_order_products 这是因为其中一个订单有两个产品。这个 total price 两次返回两个产品的订单总数。就像我的

    id  total
    1   10
    2   10
    3   10
    4   10
    5   20
    

    还有我的 销售订单产品

    id  order_id  quantity
    1   1         1
    2   2         1
    3   3         1 
    4   4         1
    5   5         1
    6   5         1
    

    为什么是 SUM() 第五张唱片还了两次? LEFT OUTER JOIN 语句只从左表中获取结果,对吗?在我看来,这是 销售订单 . 在我看来它应该会回来 全部的 列结果类似 60 现在又回来了 80 . 我的错在哪里?谢谢您!

    1 回复  |  直到 7 年前
        1
  •  0
  •   D-Shih    7 年前

    因为房间里有两排 sales_order_products 是哪张桌子 order_id = 5 ,遗嘱关系 sales_order 桌子,哪个 id = 5

    JOIN

    在你的情况下,你可以使用 DISTINCT 然后删除副本 join

    CREATE TABLE sales_order(
       ID INT,
       total INT
    );
    
    
    INSERT INTO sales_order VALUES (1,10);
    INSERT INTO sales_order VALUES (2,10);
    INSERT INTO sales_order VALUES (3,10);
    INSERT INTO sales_order VALUES (4,10);
    INSERT INTO sales_order VALUES (5,20);
    
    CREATE TABLE sales_order_products(
       ID INT,
       order_id INT,
      quantity INT
    );
    
    
    INSERT INTO sales_order_products VALUES (1,1,1);
    INSERT INTO sales_order_products VALUES (2,2,1);
    INSERT INTO sales_order_products VALUES (3,3,1); 
    INSERT INTO sales_order_products VALUES (4,4,1);
    INSERT INTO sales_order_products VALUES (5,5,1);
    INSERT INTO sales_order_products VALUES (6,5,1);
    

    查询1 :

    SELECT
       SUM(`sales_order`.`total`) as total,
       SUM(sop.`quantity`) as total
    FROM `sales_order`
    LEFT JOIN (SELECT DISTINCT `quantity`,`order_id` FROM `sales_order_products`) sop
    ON `sales_order`.`id` = sop.`order_id`
    

    Results

    | total | total |
    |-------|-------|
    |    60 |     5 |