mysql语句中的left / right / inner join

时间:2015-06-19 22:14:14

标签: mysql

我有以下SQL查询:

SELECT band.id bid, band.name, bandInfo.summary, bandImage.url bandImage, 
user.username, user.online, userImage.url userImage
FROM bands AS band
INNER JOIN band_info AS bandInfo ON band.id = bandInfo.bid
LEFT JOIN band_images AS bandImage ON band.id = bandImage.bid
LEFT JOIN band_followers AS follower ON follower.bid = band.id
RIGHT JOIN users AS user ON user.id = follower.uid
INNER JOIN user_info AS userInfo ON userInfo.uid = user.id
LEFT JOIN user_images AS userImage ON user.id = userImage.uid
WHERE ((band.activated = 1) AND (user.activated = 1)) AND (bandInfo.language = 'fr')
ORDER BY band.name

'users'表包含所有用户(一行=一个用户)

'user_info'表包含有关用户的所有信息(一行=一个用户)

'user_images'表包含有关用户的所有图像(一行=一个用户)

'bands'表包含所有乐队(一行=一个乐队)

'band_info'表包含有关某个频段的所有信息(由于该语言,一个频段有多行)

'band_images'表包含有关波段的所有图像(一行=一个波段)

'band_followers'表包含用户和波段之间的所有关系(一行=一个关系,因此有许多行包含相同的波段ID但不是相同的用户ID)

我想用其信息(INNER JOIN)检索所有乐队,即使乐队ID不在band_followers表中。当band id在band_followers表中时,我想要检索所有band,并在用户id上使用INNER JOIN和用户的信息(INNER JOIN),即使他没有任何图像。

我的问题只是JOIN关键字..我真的不知道我是否必须使用LEFT或RIGHT JOIN

谢谢!

更新答案:

SELECT band.id bid, band.name, bandInfo.summary, bandImage.url bandImage, user.username, user.online, userImage.url userImage
FROM bands AS band
INNER JOIN band_info AS bandInfo ON band.id = bandInfo.bid
LEFT JOIN band_images AS bandImage ON band.id = bandImage.bid
LEFT JOIN band_followers AS follower ON band.id = follower.bid
LEFT JOIN users AS user ON user.id = follower.uid AND user.activated = 1
LEFT JOIN user_info AS userInfo ON userInfo.uid = user.id
LEFT JOIN user_images AS userImage ON user.id = userImage.uid
WHERE (band.activated = 1) AND (bandInfo.language = 'fr')
ORDER BY band.name

谢谢大家

4 个答案:

答案 0 :(得分:2)

您应该在LEFT JOINusers之前使用user_info,就像在band_followers之前一样。 LEFT JOIN表示返回前一个表的所有行,即使它们与您正在加入的表中的任何内容都不匹配。 RIGHT JOIN表示返回您正在加入的表格的所有行。因此,如果您使用RIGHT JOIN users,您将获得所有用户,而不仅仅是关注该频段的用户。

您还应该将测试user.activated = 1放入ON的{​​{1}}子句中。否则,您将过滤掉所有没有关注者的频段,因为他们没有LEFT JOIN users的关注者。

答案 1 :(得分:1)

简单:“左连接”表示取左项,如果匹配正确,请附上它。

答案 2 :(得分:1)

只要你有

这样的陈述
  

即使band_followers表中没有band id。

OR

  

即使他没有任何形象

根据您的要求,尝试OUTER JOINLEFT OUTER JOIN使用RIGHT OUTER JOIN

答案 3 :(得分:1)

这个问题可能会帮助你What is the difference between "INNER JOIN" and "OUTER JOIN"?

但最好的答案就是这张照片(在我看来)

http://i.stack.imgur.com/1UKp7.png