Справка по запросу? MySQL, ЛЕВОЕ СОЕДИНЕНИЕ, ГРУППИРОВКА по отсутствующим данным

#mysql #sql #join

#mysql #sql #Присоединиться

Вопрос:

Как мне изменить этот запрос, чтобы он по-прежнему показывал 0 обломков, полученных в 2011-01-01 после добавления строки 2011-01-02?

 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:

Использовать:

    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
  

Критерии, предусмотренные в ON предложении ВНЕШНЕГО СОЕДИНЕНИЯ (СЛЕВА, СПРАВА), применяются перед ОБЪЕДИНЕНИЕМ. Критерии в предложении WHERE в отношении таблицы, к которой выполняется ВНЕШНЕЕ присоединение, применяются после объединения.