2013-02-02 125 views
0

我目前正在試圖加入與左邊的兩個表的連接:SQL連接不正確顯示

--portal--

  • id_portal(指數)
  • id_venue
  • name_portal

- access -

  • id_access(指數)
  • id_event
  • id_portal
  • id_tickets
  • scan_access

'訪問' 包含每門戶許多票種爲每個事件。我需要組合這些以獲得每個門戶的scan_access列的總和,但包括具有'null'scan_access以獲得'0'的門戶。要做到這一點我用左連接:

SELECT portal.name_portal, SUM(access.scan_access) AS total_scan 
FROM portal LEFT JOIN access ON portal.id_portal = access.id_portal 
WHERE portal.id_venue = $venueId 
GROUP BY portal.id_portal 
ORDER BY portal.id_portal ASC 

這意味着我得到如下:

  • 門戶1 - 空
  • 傳送門2 - 40
  • 門戶網站3 - 33
  • 門戶網站4 - 空

但我有一個問題,當我需要還可以得到次考慮到當E以上的結果,因爲當我使用下列事件(id_event):

我得到:

  • 傳送門2 - 40
  • 門戶3 - 33

這是有道理的,因爲那些只有兩行具有id_event值。但是我怎樣才能在不損失其他門戶的情況下考慮到這一點?另外,是否有一種方法在sql中使'null'爲零時返回結果? (我可以用PHP後修復空,但想看看是否有可能)

+0

ü可以給ü想怎麼輸出中時便會 –

+0

我不知道你編輯ThinkingStiff –

+0

我做了這樣的SQL是不是都在同一行,因此它的着色增添了一絲格式例子。 – ThinkingStiff

回答

2

通過將access.id_event = 20放入您的WHERE條款中,您將您的LEFT JOIN變成INNER JOIN。將access.id_event = 20轉換爲您的加入標準以保留您的LEFT JOIN。正如@echo_me提到的,你可以使用COALESCE()來擺脫你的零。我把它放在SUM()的周圍,而不是裏面。

SELECT portal.name_portal, COALESCE(SUM(access.scan_access), 0) AS total_scan 
FROM portal LEFT JOIN access ON portal.id_portal = access.id_portal AND access.id_event = 20 
WHERE portal.id_venue = $venueId 
GROUP BY portal.id_portal 
ORDER BY portal.id_portal ASC 
+0

非常感謝。 –

1

爲NULL轉換爲0使用這種

COALESCE(col, 0) 
在你的榜樣

這將是

 SUM(COALESCE(access.scan_access, 0)) AS total_scan