2014-06-17 73 views
1

我有一個問題,當我加入一個表中不存在條目。加入/聯盟時總結列

設置是這樣的:

(此表包含的誰可以把人的自由的參賽名單上的人名單)

表1:

ID,NAME,GUESTS 

其中GUESTS是多少他們讓下列名單中沒有名字:

(這包含所有被授予免費入場的人的姓名和客人)

表2:

ID,PROMOTERID,NAME,GUESTS 

其中PROMOTERID爲外鍵表1科拉姆ID。

這個想法是表1中的GUESTS字段中的任何字段都應該添加到表2中列出的總客人名單中。例如,如果ID 4的發起人已將6人免費參賽名單,但也讓額外的3人(這將存儲在他的GUESTS值在表1),我需要一個視圖,其中啓動子ID總客人數爲9。

這工作只要在表2中無法找到他的身份證號碼 - 也就是說,如果他允許某人免費入場,但從未將某人置於免費入境名單中,則他不包含在視圖中。

查看樣子:

select `table1`.`NAME` AS `NAME`,`table2`.`PROMOTERID` AS `Promoter` 
,(sum(`table2`.`GUESTS`) + `table1`.`GUESTS`) AS `TOTAL` from 
(`table1` join `table2` on((`table1`.`ID` = `table2`.`PROMOTERID`))), 
group by `table2`.`PROMOTERID` 

什麼我需要在表2改變爲獲得總不管條目的存在對於給定的子ID?

+0

LEFT JOIN將帶回列,那裏是一個空 – Bobby

+0

我試着用左加入,但在該領域是把NULL。我不需要null。如果發起人在表2中沒有人,我需要從表1中得到他的計數。 – nickdnk

回答

0

您可以結合使用LEFT JOINIFNULL得到你想要的東西:

select `table1`.`NAME` AS `NAME`,`table2`.`PROMOTERID` AS `Promoter` 
,(IFNULL(sum(`table2`.`GUESTS`),0) + `table1`.`GUESTS`) AS `TOTAL` from 
(`table1` LEFT join `table2` on((`table1`.`ID` = `table2`.`PROMOTERID`))), 
group by `table1`.`ID` 

這將給0(零),如果表2沒有涉及到任何table1的記錄,因此,除此之外,你會希望它能夠工作。

IFNULL的描述可以在這裏找到:http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html

+0

這給出與COALESCE相同的問題。如果不止一個人在他的COUNT字段中有某些內容,但是他的ID中沒有表2中的條目,則只有這些發起人中的第一個會在您的解決方案中顯示。 – nickdnk

+0

啊,我忽略了查詢中的分組在table2上。如果您將分組更改爲'group by table1.id',會不會有幫助? – CoolWilly

+0

不,仍然只有一個結果,我應該得到兩個(或更多)。 – nickdnk

0

如果您只是尋找發起人進入的人的總數,它會是。

SELECT SUM(t.Guests) 
FROM Table1 AS t 
+0

如果他們讓別人進來但不包括他們的客人名單條目,這隻會給出總數。 – nickdnk