MySQL Left Join не дает ожидаемых результатов - PullRequest
0 голосов
/ 07 октября 2011

Я знаю, что на 1001 * Left Joins есть много хороших ответов, но у меня возникают проблемы с поиском чего-то, имеющего отношение к моей конкретной проблеме.Я прошу прощения за возможную повторную тему, но помощь будет принята с благодарностью.

У меня есть две таблицы с продажами подарочных карт.Я должен убедиться, что суммы совпадают.Я ищу помощь в написании запроса, который будет возвращать все из ТАБЛИЦЫ A, даже если в ТАБЛИЦЕ B нет соответствующей записи.

ТАБЛИЦА A

| id | business_date | am_pm | gift_cards_sold | 
================================================
 103 | 2011-10-06    | PM    | 175.03
 104 | 2011-10-06    | PM    | 135.03
 105 | 2011-10-06    | PM    | 250.74
 106 | 2011-10-06    | PM    | 180.44
 107 | 2011-10-06    | PM    | 150.10
 108 | 2011-10-06    | PM    | 130.00

ТАБЛИЦА B

| id | business_date | am_pm | gift_cards_sold | 
================================================
 103 | 2011-10-06    | PM    | 100.03
 105 | 2011-10-06    | PM    | 250.74
 106 | 2011-10-06    | PM    | 180.44
 107 | 2011-10-06    | PM    | 150.10

Вот мой запрос (очевидно, что-то не так с ним)

SELECT A.id AS ID, A.gift_cards_sold AS A_SOLD, B.gift_cards_sold AS B_SOLD
FROM A
LEFT JOIN B
USING (id)
WHERE A.am_pm = 'PM'
AND A.business_date = '2011-10-06'
AND B.business_date = '2011-10-06'
GROUP BY A.id
ORDER BY A.id ASC

Вот результат:

| id | A_SOLD | B_SOLD | 
========================
 103 | 175.03 | 100.03
 105 | 250.74 | 250.74
 106 | 180.44 | 180.44
 107 | 150.10 | 150.10

Как вы можете видеть, есть отклонениес идентификатором 103. Однако мне нужно, чтобы результат показывал каждый идентификатор независимо от того, есть совпадение или нет.Результирующий набор - это то, что я ожидаю от использования Inner Join.

Ответы [ 4 ]

1 голос
/ 07 октября 2011

Просто переместите условие B.business_date = '2011-10-06' из условия WHERE в предложение ON. Когда у вас есть соединение LEFT, условие WHERE для столбцов второй таблицы (кроме IS (NOT) NULL) фактически отменяет LEFT JOIN, тогда оно действует как INNER JOIN.

SELECT A.id AS ID
     , A.gift_cards_sold AS A_SOLD
     , B.gift_cards_sold AS B_SOLD
FROM A
  LEFT JOIN B
    ON  B.id = A.id
    AND B.business_date = '2011-10-06'
WHERE A.am_pm = 'PM'
  AND A.business_date = '2011-10-06'
ORDER BY A.id
1 голос
/ 07 октября 2011

Я не уверен, почему вы использовали предложение "group by" - здесь это не нужно, и в большинстве других баз данных будет синтаксическая ошибка.

Я предполагаю, что вам нужно толькочтобы соответствовать строкам на id.

Это должно работать:

select A.id AS ID, A.gift_cards_sold AS A_SOLD, B.gift_cards_sold AS B_SOLD
 from A left join b on b.id = a.id
where A.business_date = '2011-10-06'  
  and A.am_pm = 'PM'
order by a.id
1 голос
/ 07 октября 2011

Вы должны использовать что-то вроде этого:

SELECT A.id AS ID, A.gift_cards_sold AS A_SOLD, B.gift_cards_sold AS B_SOLD
FROM A
LEFT JOIN B
USING (id)
WHERE A.am_pm = 'PM'
AND A.business_date = '2011-10-06'
AND (B.business_date = '2011-10-06' or B.business_date is null)
GROUP BY A.id
ORDER BY A.id ASC
0 голосов
/ 07 октября 2011

Проблема с условием where для B.business_date, также должно быть разрешено null

SELECT A.id AS ID, A.gift_cards_sold AS A_SOLD, B.gift_cards_sold AS B_SOLD
FROM A LEFT JOIN B ON A.id = B.id
WHERE A.am_pm = 'PM'
AND A.business_date = '2011-10-06'
AND (B.business_date = '2011-10-06' OR B.business_date is null )
ORDER BY A.id ASC
...