好的。我有一个查询,看起来像这样:
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
如果将日期条件放在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);
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。