2012-02-28 152 views
0

我寫這條SQL語句:SQL INNER JOIN修復

SELECT 
    e.id AS event_id, e.title, e.date, e.category, e.place, e.minAge, e.maxAge, 
    p.id, p.name, p.coor, p.nz, 
    a.user, a.event, COUNT(a.user) AS attending, 
    i.user_id, i.event_id 
FROM events AS e 
LEFT JOIN attendance a ON a.event = e.id 
LEFT JOIN places p ON p.id = e.place 
LEFT JOIN invited_friends i ON (i.event_id = e.id) AND (i.user_id = 0) 
GROUP BY e.id 
ORDER BY attending DESC 

此語句選擇從表事件事件和參加一些表。目前爲止一切都很好。 我有另一個表格:invited_friends

event_id bigint(20)  
user_id  int(11) 
owner  tinyint(1) 

此表存儲邀請參加活動的用戶ID。

問題是,並非每個事件都是私人事件,並非每個事件都有被邀請的朋友......我可以判斷事件是否是私人事件的方式是列:類別事件表中,如果它= 4那麼這是一場私人活動。

我的內連接的作品,但它忽略了所有的公共事件,因爲他們沒有邀請的朋友。

我該如何解決呢?

在此先感謝。

+0

不明白,什麼是所需的輸出?只是私人活動,還是什麼? – 2012-02-28 21:18:26

+1

爲invite_Friends添加左連接而不是內連接? – 2012-02-28 21:20:54

+0

所需的輸出是所有事件,但是如果事件是私有的,那麼當前用戶需要被邀請,否則它將忽略它:像我的內部連接:''INNER JOIN invite_friends我ON(i.event_id = e。 id)AND(i.user_id = 0)''。左連接是好的,但它不解決我的問題,因爲它仍然給我說,你的問題當前用戶沒有被邀請到 – Amir 2012-02-28 21:21:50

回答

2
... 
FROM events AS e 
LEFT JOIN attendance a ON a.event = e.id 
LEFT JOIN places p ON p.id = e.place 
LEFT JOIN invited_friends i ON (i.event_id = e.id) AND (i.user_id = 0) 

WHERE category != 4 or i.event_id is not null 

... 
+0

左連接是好的,但它不解決我的問題,因爲它仍然給我私人活動,目前的用戶不被邀請到 – Amir 2012-02-28 21:25:43

+0

對不起,我之前我寫了WHERE部分 - 但我不知道如果用戶沒有被邀請什麼是null;)) – Aprillion 2012-02-28 21:27:25

+0

太神奇了!像魅力一樣......非常感謝你! – Amir 2012-02-28 21:30:26

2

我不知道如果我理解這個問題,然後。只需讓INNER JOIN成爲一個LEFT JOIN即可。它會像現在這樣工作,如果沒有邀請的朋友,那麼它會用null填充invite_friends部分。這將使得沒有朋友的公共活動得到滿足......只是沒有朋友。

+1

左連接私人活動是好的,但它不解決我的問題,因爲它仍然給我當前用戶沒有被邀請到 – Amir 2012-02-28 21:23:15

0

LEFT OUTER JOIN上invited_friends而不是直接INNER JOIN.

這應該給你你想要的結果。

http://en.wikipedia.org/wiki/Join_(SQL)#Left_outer_join

+0

私人事件??我即時在一個'LEFT OUTER JOIN'是完全一樣的'LEFT JOIN' – 2012-02-28 21:21:16

+0

的understaing那麼爲什麼不乾脆UNION它的公共列表事件? 選擇e.id AS事項標識,e.title,e.date,e.category,e.place,e.minAge,e.maxAge, p.id,p.name,p.coor,p.nz, a.user,a.event,COUNT(a.user)AS主治, i.user_id,i.event_id FROM事件爲E LEFT JOIN出勤一個ON a.event = e.id LEFT JOIN地址p ON p.id = e.place INNER JOIN invite_friends i ON(i.event_id = e.id)AND(i.user_id = 0) GROUP BY e。ID ORDER BY參加DESC UNION (查詢選擇公共事件) – 2012-02-28 21:25:56

0

可以使用,而不是LEFT JOININNER JOIN

+0

左連接是好的,但它不能解決我的問題,因爲它仍然給我私人活動,當前用戶不被邀請 – Amir 2012-02-28 21:23:41