2010-04-05 81 views
0

这关系到我的其他问题: Managing Foreign KeysMySQL的 - 加入比赛和非比赛

我想参加比赛和非比赛的表。

所以我有一个兴趣列表,用户列表和用户兴趣列表。

我希望查询返回所有兴趣,无论用户是否有兴趣(在这种情况下应该为null),只有用户= x的地方。我每次得到查询时,都会查询用户特有的唯一匹配的兴趣,而不管他们是否拥有所有兴趣。

回答

0
SELECT * 
FROM interests i 
LEFT JOIN userinterests ui ON i.interestID = ui.interestID 
LEFT JOIN users u ON ui.userID = u.uiserID 
and u.userID = ? 

如果你把在那里的条件上不应该有记录inteh主要tbale一个表,你转换从左侧联接到一起的内连接。唯一一次你应该有一个条件,在左边加入的右边的某个事件中,当你搜索的记录不匹配时(例如,u.userid为空)

当然,您应该定义要选择的字段,并且绝对不要在生产代码中使用select *,特别是在有连接的情况下,因为它会通过网络发送重复的信息(重复数据连接加入域),浪费资源和糟糕的编程出于多种原因的练习。

+0

我想选择*仅仅是为了例子的缘故,我绝对不会使用它。但是,我不确定这是如何回答我的问题?我需要两个行和不匹配的行,这就是为什么我认为我可能只能做联合。 – jwzk 2010-04-05 19:53:50

+0

这应该会给你做和不匹配的行。这是左连接的阴谋。它会提供来自INeterests的所有记录,如果有用户附加到这些兴趣上,它也将显示它们。 – HLGEM 2010-04-05 20:36:20

+0

完美!对不起,我猜我错过了AND而不是WHERE,因为代码看起来一样。谢谢。 – jwzk 2010-04-06 14:09:45

2

你还是使用LEFT JOINS

喜欢的东西

SELECT * 
FROM interests i LEFT JOIN 
     userinterests ui ON i.interestID = ui.interestID LEFT JOIN 
     users u ON ui.userID = u.uiserID 
WHERE userID = ? 

其中用户ID,你正在寻找。

+0

MySQL中的'LEFT JOIN'代表'LEFT OUTER JOIN'。 – 2010-04-05 18:03:24

+0

由于某种原因我无法工作。我确实发现这可行,但它可能不是最好的。 SELECT * FROM 利益 LEFT JOIN user_interests UI在ui.interest_id = interests.interest_id 其中USER_ID = '1' UNION SELECT * FROM利益 LEFT JOIN user_interests UI在ui.interest_id = interests.interest_id – jwzk 2010-04-05 18:20:49