2015-06-19 79 views
0

我有以下SQL查询:左/右/内对MySQL的声明加入

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 

“用户”表包含所有用户(一行=一个用户)

“USER_INFO”表包含所有关于用户的信息(一行=一个用户)

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

“乐队”表包含了所有的乐队(一行=一个波段)

“band_info”表包含有关一个频带中的所有信息(多行用于一个频带由于语言)

“band_images”表包含有关频带中的所有图像(一行=一个频带)

“ band_followers'表包含用户和乐队之间的所有关系(一行=一个关系,所以有很多行包含相同的乐队ID但不是相同的用户ID)

我想检索所有乐队与他们的信息(INNER JOIN )即使乐队ID不在band_followers表中。即使他没有任何图像,我也想通过用户的信息(INNER JOIN)检索乐队ID在band_followers表中带有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 

谢谢大家

回答

2

你应该usersuser_info之前使用LEFT JOIN,就像你做之前band_followersLEFT JOIN表示即使它们不匹配您要加入的表中的任何内容,也要返回先前表的所有行。 RIGHT JOIN表示返回您加入的表的所有行。因此,如果您使用RIGHT JOIN users,您将获得所有用户,而不仅仅是跟随乐队的用户。

您还应该将测试user.activated = 1放入LEFT JOIN usersON子句中。否则,你会过滤掉所有没有追随者的乐队,因为他们没有任何追随者user.activated

+0

这是正确的答案,谢谢! – everytimeicob

1

简单:“左连接”是指把左边的项目,如果有匹配的合适的人,将其固定。

1

只要你有一个像

陈述即使带ID不在band_followers表。

OR

即使他没有任何图像

尝试使用OUTER JOIN喜欢的方式LEFT OUTER JOIN OR RIGHT OUTER JOIN按照您的要求。

+1

这就是他正在使用的。 'LEFT JOIN'和'RIGHT JOIN'总是外连接,'OUTER'这个词是可选的。 – Barmar

+0

@Barmar,是的,但我相信OP说的是,他很困惑他是否应该使用OUTER/INNER join。这就是我想指出的答案。 – Rahul

+0

对不起,我误解了你的答案,我以为你只是告诉他把'LEFT JOIN'改成'LEFT OUTER JOIN'。 – Barmar