Запрос помочь?MySQL, LEFT JOIN, GROUP BY, отсутствующие данные - PullRequest
0 голосов
/ 26 мая 2011

Как изменить этот запрос, чтобы он по-прежнему отображал 0 flotsam, полученных 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 Ответ

1 голос
/ 26 мая 2011

Использование:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...