2011-10-06 103 views
0

我知道有很多很好的问题在左回答回答,但我有麻烦找到有关我的特定问题的东西。我为可能重复的话题表示歉意,但不胜感激。MySQL左加入不产生预期结果

我有两个包含礼品卡销售的表。我必须验证金额是否匹配。 我正在寻找帮助编写一个查询,从表一回一切即使是表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号方差不过,我需要的结果显示每一个ID,无论是否有匹配与否。结果集是我期望使用Inner Join的结果。

回答

1

只需从WHERE移动B.business_date = '2011-10-06'条件的ON条款。当您有LEFT联接时,关于第二个表格列(除IS (NOT) NULL之外)的WHERE条件实际上取消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 
+0

感谢您的帮助。 – Brett

1

你应该使用这样的事情:你为什么用

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

问题是与B.business_date WHERE条件,也应该允许空

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 
1

我不知道一个“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 
+0

“Group By”不需要。我从习惯中输入它,谢谢。 – Brett

+0

人们建议左连接B,然后添加'或B.xxx为空'显然不明白左连接是什么。 – GreyBeardedGeek