查询帮助? MySQL,LEFT JOIN,GROUP BY,缺少数据

问题描述

| 如何更改此查询,以使其在添加2011-01-02行后​​仍显示0个在2011-01-01收到的flotsam?
MysqL> SELECT * FROM Items;
+---------+
| Name    |
+---------+
| widgets | 
| things  | 
| stuff   | 
| flotsam | 
| jetsam  | 
+---------+

MysqL> SELECT * FROM Received;
+---------+---------------+-------------+----------+
| Name    | invoiceNumber | invoiceDate | Quantity |
+---------+---------------+-------------+----------+
| widgets |             1 | 2011-01-01  |        1 | 
| widgets |             2 | 2011-01-01  |        2 | 
| things  |             3 | 2011-01-01  |        3 | 
| things  |             4 | 2011-01-01  |        4 | 
| stuff   |             5 | 2011-01-01  |        5 | 
| jetsam  |             7 | 2011-01-01  |        7 | 
+---------+---------------+-------------+----------+

MysqL> SELECT Name,IFNULL(SUM(Quantity),0)
    -> FROM Items AS I
    -> LEFT JOIN Received AS R
    -> USING (Name)
    -> WHERE invoiceDate=\'2011-01-01\' OR invoiceDate IS NULL
    -> GROUP BY Name;
+---------+-------------------------+
| Name    | IFNULL(SUM(Quantity),0) |
+---------+-------------------------+
| flotsam |                       0 | 
| jetsam  |                       7 | 
| stuff   |                       5 | 
| things  |                       7 | 
| widgets |                       3 | 
+---------+-------------------------+

MysqL> INSERT INTO Received VALUES (\'flotsam\',8,\'2011-01-02\',8);

MysqL> SELECT Name,0) |
+---------+-------------------------+
| jetsam  |                       7 | 
| stuff   |                       5 | 
| things  |                       7 | 
| widgets |                       3 | 
+---------+-------------------------+
    

解决方法

采用:
   SELECT i.name,COALESCE(SUM(r.quantity),0) AS total_quantity
     FROM ITEMS i
LEFT JOIN RECEIVED r ON r.name = i.name
                    AND r.invoicedate = \'2011-01-01\'
 GROUP BY i.name
在JOIN之前应用OUTER JOIN的
ON
子句中提供的条件(左,右)。在JOIN之后应用WHERE子句中的条件(针对将表OUTER JOIN连接到的条件)。