2011-05-25 50 views
0

如何更改此查詢,以便在添加2011-01-02行後​​仍顯示2011-01-01收到的0個flotsam?查詢幫助? MySQL,LEFT JOIN,GROUP BY,缺失數據

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, 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) | 
+---------+-------------------------+ 
| jetsam |      7 | 
| stuff |      5 | 
| things |      7 | 
| widgets |      3 | 
+---------+-------------------------+ 

回答

1

用途:外的ON子句中提供

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(左,右)是JOIN之前施加。 WHERE子句中的條件,針對正在進行外部連接的表,應用 JOIN。