开发者社区> 问答> 正文

COALESCE SUM GROUP?

好的。我有一个查询,看起来像这样:

SELECT SUM(order_items.quantity) as count, menu_items.name FROM orders, menu_items, order_items WHERE orders.id = order_items.order_id AND menu_items.id = order_items.menu_item_id AND orders.date >= '2008-11-01' AND orders.date <= '2008-11-30' GROUP BY menu_items.id 该查询的目的是显示在给定日期范围内售出的商品数量。尽管此方法有效,但现在我需要它来显示countof 0在日期范围内某个特定商品是否没有销售。我尝试使用COALESCE,SUM但是并没有解决问题,而且我也没有真正期望它会实现。无论如何,有人知道我将如何实现这一目标吗?我正在那些时刻中的一刻,我觉得我应该知道这一点,但我想不起来。

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-18 16:56:46 535 0
1 条回答
写回答
取消 提交回答
  • 如果将日期条件放在JOIN子句中,则无需任何子查询即可完成此操作。

    以下是我在MySQL 5.0上测试过的代码。

    SELECT m.name, COALESCE(SUM(oi.quantity), 0) AS count FROM menu_items AS m LEFT OUTER JOIN ( order_items AS oi JOIN orders AS o ON (o.id = oi.order_id) ) ON (m.id = oi.menu_item_id AND o.date BETWEEN '2008-11-01' AND '2008-11-30') GROUP BY m.id; 输出:

    +--------+-------+ | name | count | +--------+-------+ | bread | 2 | | milk | 1 | | honey | 2 | | cheese | 0 | +--------+-------+ 这是MySQL风格的DDL和设置代码:

    DROP TABLE IF EXISTS menu_items; CREATE TABLE menu_items ( id INT PRIMARY KEY, name VARCHAR(10) ) TYPE=InnoDB;

    DROP TABLE IF EXISTS orders; CREATE TABLE orders ( id INT PRIMARY KEY, date DATE ) TYPE=InnoDB;

    DROP TABLE IF EXISTS order_items; CREATE TABLE order_items ( order_id INT, menu_item_id INT, quantity INT, PRIMARY KEY (order_id, menu_item_id), FOREIGN KEY (order_id) REFERENCES orders(id), FOREIGN KEY (menu_item_id) REFERENCES menu_items(id) ) TYPE=InnoDB;

    INSERT INTO menu_items VALUES (1, 'bread'), (2, 'milk'), (3, 'honey'), (4, 'cheese');

    INSERT INTO orders VALUES (1, '2008-11-02'), (2, '2008-11-03'), (3, '2008-10-29');

    INSERT INTO order_items VALUES (1, 1, 1), (1, 3, 1), (2, 1, 1), (2, 2, 1), (2, 3, 1), (3, 4, 10);

    2019-11-18 16:57:11
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Show Me The Money! Cost & Reso 立即下载
对 2000 多亿条数据做一次 group by 需要多久? 立即下载
对2000多亿条数据做一次Group By 需要多久 立即下载