Как сохранить строки со значениями NULL, которые не удовлетворяют условию в предложении WHERE, после того, как LEFT присоединился к двум таблицам - PullRequest
2 голосов
/ 12 марта 2019

Мои таблицы:

person
| Id | Name |
| ---| -----| 
| 1  | Bob  | 
| 2  | Mary | 

sales
| SalesID  | PersonID| Year | Amount |
| -------  | ------- | ---- | ------ |
| 1        | 1       | 2010 | 100    |

Мой запрос:

SELECT * FROM person LEFT JOIN sales on person.ID = sales.PersonID WHERE sales.Year = 2010 GROUP BY person.ID

Что я получаю:

 | Id | Name | SalesID  | PersonID| Year | Amount |
 | ---| -----| -------  | ------- | ---- | ------ |
 | 1  | Bob  | 1        | 1       | 2010 | 100    |

Что я хочу:

| Id | Name | SalesID  | PersonID| Year | Amount |
| ---| -----| -------  | ------- | ---- | ------ |
| 1  | Bob  | 1        | 1       | 2010 | 100    |
| 2  | Mary | NULL     | NULL    | NULL | NULL   |     

Я хочу посмотреть сумму для каждого человека за определенный год. Если человек ничего не продал в этом году (продажи не имеют удостоверения личности), я все равно хочу, чтобы это было включено в результат.

1 Ответ

3 голосов
/ 12 марта 2019

Вы можете попытаться разрешить sales.Year = 2010 быть условием on вместо where пункт.

Настройка схемы MySQL 5.6 :

CREATE TABLE person(
   Id INT,
   Name VARCHAR(50)
);

INSERT INTO person VALUES (1,'Bob'); 
INSERT INTO person VALUES (2,'Mary');

CREATE TABLE sales(
   SalesID INT,
   PersonID INT,
     Year INT,
   Amount INT
);


INSERT INTO sales VALUES (1,1 ,2010,100 );

Запрос 1 :

SELECT * 
FROM person 
LEFT JOIN sales on person.ID = sales.PersonID and sales.Year = 2010
GROUP BY person.ID

Результаты :

| Id | Name | SalesID | PersonID |   Year | Amount |
|----|------|---------|----------|--------|--------|
|  1 |  Bob |       1 |        1 |   2010 |    100 |
|  2 | Mary |  (null) |   (null) | (null) | (null) |

Примечание

Если вы выполняете внешнее JOIN, добавьте WHERE условия к предложению ON для таблиц. Это необходимо, потому что добавление предложения WHERE, которое получит только строку sales.Year = 2010.

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