2

我对 SQL 查询有疑问。如果给定的订单包含项目,女巫不包含子项目,那么订单的总价格为零,否则此查询工作正常。

SELECT o.`id`, o.`date`, c.`name`,
      ((i.`quantity` * i.`price`) +
      SUM(i.`quantity` * subi.`quantity_kg` * subi .`price`)) as total_price
FROM `order` o
JOIN `customer` c ON o.`id_customer`=c.`id`
LEFT JOIN `order_item` i ON i.`id_order`= o.`id`
LEFT JOIN `order_subitem` subi ON si.`id_product`= i.`id_product`
GROUP BY o.`id`

谢谢你的帮助。

4

3 回答 3

2

coalesceifnull您的子项目字段上使用:

SELECT o.`id`, o.`date`, c.`name`,
      ((i.`quantity` * i.`price`) +
      SUM(i.`quantity` * coalesce(subi.`quantity_kg`, 0) * coalesce(subi .`price`, 0))) as total_price

这样可以确保这些字段最终不会为空而破坏您的整个计算。例如 null+1 = null

于 2012-06-21T14:54:06.877 回答
1
SELECT o.`id`, o.`date`, c.`name`,
      ((i.`quantity` * i.`price`) +
      SUM(i.`quantity` * IFNULL(subi.`quantity_kg`, 0) * IFNULL(subi .`price`, 0))) as total_price
FROM `order` o
JOIN `customer` c ON o.`id_customer`=c.`id`
LEFT JOIN `order_item` i ON i.`id_order`= o.`id`
LEFT JOIN `order_subitem` subi ON si.`id_product`= i.`id_product`
GROUP BY o.`id`

如果您知道 order_item 应该存在,那么您应该为此表使用 INNER JOIN。

于 2012-06-21T14:53:58.453 回答
1

我怀疑问题在于您返回的是 NULL,而不是 0。要解决此问题,您只需要 coalesce 函数来处理 NULL 情况:

SELECT o.`id`, o.`date`, c.`name`,
       ((i.`quantity` * i.`price`) +
        SUM(i.`quantity` * coalesce(subi.`quantity_kg`, 0) * coalesce(subi .`price`, 0))
       ) as total_price
FROM `order` o JOIN
     `customer` c
     ON o.`id_customer`=c.`id` LEFT JOIN
     `order_item` i
     ON i.`id_order`= o.`id` LEFT JOIN
     `order_subitem` subi ON si.`id_product`= i.`id_product`
GROUP BY o.`id` 
于 2012-06-21T14:55:21.930 回答