mysql - 获取不同表格中形成的父类别总和(价格)
问题描述
我正在尝试获取特定月份和年份中所有父类别的总价格。父类别是 parent_id == 0 的任何类别。我的查询如下:
SELECT
ROUND(SUM(od.total_price)) as price,
c.parent_id as pId,
c1.name
FROM a_orders o
INNER JOIN a_order_details as od on o.id = od.order_id
INNER JOIN a_product as p on p.id = od.product_id
INNER JOIN a_category as c on c.id = p.category_id
LEFT OUTER JOIN a_category c1 ON c.parent_id = c1.id
WHERE YEAR(order_date) = 2018
AND o.STAT = 'Y'
AND MONTH(order_date) = 6
GROUP BY c.parent_id;
我正在获取具有价格的父类别,但我需要获取所有父类别,如果没有价格结果应该为 0。
我的 sqlfiddle 是-> http://sqlfiddle.com/#!9/b9f4c1/1
我的结果是这样的:
price pId name
410 1 T-SHIRT
400 2 JEANS
但应该是这样的:
price pId name
410 1 T-SHIRT
400 2 JEANS
0 6 SHOES
解决方案
为此,您需要切换逻辑。首先选择您所有的父类别,然后加入您的订单数据。这样,您可以确保所有所需的类别都包含在结果中。
有很多方法可以解决这个问题——在这里我创建了一个包含所有订单数据的子查询,然后创建了一个LEFT JOIN
包含类别表的子查询:
SELECT
IFNULL(ROUND(SUM(orders.total_price)),0) AS price,
c.id AS pId,
c.name
FROM a_category c
LEFT JOIN (
SELECT od.total_price, c.parent_id
FROM a_orders o
INNER JOIN a_order_details od ON o.id = od.order_id
INNER JOIN a_product p ON p.id = od.product_id
INNER JOIN a_category c ON c.id = p.category_id
WHERE YEAR(order_date) = 2018
AND o.STAT = 'Y'
AND MONTH(order_date) = 6
) orders ON orders.parent_id = c.id
WHERE c.parent_id = 0
GROUP BY c.id;
推荐阅读
- laravel - 如何在 Laravel 中安装 Chart.js?(“未捕获的 ReferenceError:未定义图表”)
- .net - 如何使用 dotnet 中的锁定文件更新到最新的浮动版本?
- python - 如何将多个字符串运算符转换为数字?
- ruby-on-rails - google_oath2 400:Rails 6 上的无效请求
- python - 如何修复 Spyder 中的高打字延迟?
- java - 无法在 Jackson 的自定义 Java 类中包装 JSON 属性
- c# - 如何从内容页面导航到 xamarin.forms 中选项卡式页面的第二个选项卡?
- flutter - 如何在颤动文本字段中为浮动标签文本设置不同的颜色?
- python - 匹配 pandas 数据框列中的单词并返回其值
- cypress - 如果表包含某些内容,则执行某些操作