【问题标题】:left/right/inner join on mysql statementmysql语句的左/右/内连接
【发布时间】:2015-06-19 22:14:14
【问题描述】:

我有以下 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)

即使乐队 ID 不在 band_followers 表中,我也想检索所有乐队及其信息(INNER JOIN)。当乐队 id 位于 band_followers 表中时,我也想检索所有乐队,并且用户 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

谢谢大家

【问题讨论】:

    标签: mysql


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      简单:“左连接”意味着取左边的项目,如果有匹配的右边,附加它。

      【讨论】:

        【解决方案3】:

        无论你在哪里有这样的陈述

        即使乐队 ID 不在 band_followers 表中。

        即使他没有任何图像

        根据您的要求尝试使用OUTER JOIN,例如LEFT OUTER JOINRIGHT OUTER JOIN

        【讨论】:

        • 这就是他正在使用的。 LEFT JOINRIGHT JOIN 始终是外连接,OUTER 这个词是可选的。
        • @Barmar,是的,但我相信 OP 所说的是,他对是否应该使用 OUTER/INNER 连接感到困惑。这就是我试图在回答中指出的。
        • 对不起,我看错了你的回答,我以为你只是告诉他把LEFT JOIN改成LEFT OUTER JOIN
        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多