#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 в отношении таблицы, к которой выполняется ВНЕШНЕЕ присоединение, применяются после объединения.