2012-02-28 154 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