【问题标题】:Outer and Inner SQL Join外部和内部 SQL 联接
【发布时间】:2013-02-27 19:12:33
【问题描述】:

我在将多个 sql 语句组合成一个更大的单个语句时遇到问题。

问题: 我有一个新闻提要,需要返回登录用户关注的帐户中的所有帖子。我还需要将一个表与其他两个表连接起来,以获取发布在新闻提要上的帐户的用户名。我有 4 个表将用于此查询:

关注者(列出用户及其关注的帐户和被关注的帐户类型)

重要栏目:[user_id, following_id, type]

用户(用户可以关注其他用户帐户)

重要栏目:[用户名]

服务器(用户也可以关注服务器帐户。请注意,服务器与用户是一对多的,因为用户可以创建 0 个或多个与其帐户绑定的服务器)

重要栏目:[标题]

News_Posts(其中包含消息、帐户类型(整数)和 poster_id)

重要栏目:[poster_id, message, type]

我不知道如何获取当前登录用户的新闻帖子。

查询 1:根据“类型”返回具有正确用户名的完整新闻列表 0 = 用户,1 = 服务器

    SELECT news_posts.*, users.username FROM news_posts INNER JOIN users ON news_posts.poster_id=users.id WHERE news_posts.TYPE='0'

UNION

    SELECT news_posts.*, servers.title FROM news_posts INNER JOIN servers ON news_posts.poster_id=servers.id WHERE news_posts.TYPE='1'

查询 2:返回特定用户(在本例中 id 为 1)正在关注的帐户

    SELECT following_id, type FROM follower WHERE user_id='1'

如何将查询 1 与查询 2 结合起来,以便只有 news_post 记录 WHERE news_posts.poster_id = 查询 2 结果。它必须考虑关注者的类型,以便使用正确的用户名

编辑:这是架构的粗略版本:http://sqlfiddle.com/#!2/a48f3/1

【问题讨论】:

  • 修改模式是否公平?例如,我是否可以建议有一个 Account 表来存储用户和服务器?该表将包含一个类型列,用于区分两种(或更多)类型的帐户?
  • 仍处于原型阶段,因此我很乐意提供改进架构的建议。此外,这是一个非常粗略的(仅主要列)架构,因此可以可视化:sqlfiddle.com/#!2/a48f3/1 编辑:我目前允许帐户拥有多个服务器,这就是我将它们分开构造的原因。所以这是一对多的关系。

标签: mysql sql union inner-join


【解决方案1】:

您要查询由 ID 为 1 的用户关注的帐户(用户或服务器)发布的所有新闻帖子。您需要有关这些帖子的所有信息以及发布者的用户名或服务器标题。这就是在 SQL 中,给定您的架构 (also at sqlfiddle):

select p.*,
    account.username
from news_posts p
    join 
        (
            select id,
                username,
                0 as type
            from users
            union
            select id,
                title,
                1 as type
            from servers
        ) account
        on (
            account.id = p.poster_id
            and account.type = p.type
        )
    join follower f
        on (
            f.following_id = account.id
            and f.type = account.type
        )
where f.user_id = 1

它还有一个额外的好处,那就是不用两次访问 news_posts 表。

【讨论】:

    【解决方案2】:

    你的意思是这样的吗?

    SELECT * FROM
    (
    SELECT news_posts.*, users.username FROM news_posts INNER JOIN users ON news_posts.poster_id=users.id WHERE news_posts.type='0'
        UNION
    SELECT news_posts.*, servers.title FROM news_posts INNER JOIN servers ON news_posts.poster_id=servers.id WHERE news_posts.type='1'
    ) un, Follower f
    WHERE un.poster_id=f.following_id
    

    修改过的小提琴:http://sqlfiddle.com/#!2/a48f3/3

    如果这不是您想要的,请说明您的要求。

    【讨论】:

    • 这非常接近,但我需要为特定用户关注的所有用户和服务器返回新闻帖子。目前它只有在poster_id 与following_id 相同的地方。我需要一个地方来指定用户 ID(当前登录的用户 ID)并从他们关注的服务器和用户返回所有新闻帖子。希望这让它更清楚一点?编辑:此外,它从关注者表和联合中选择所有内容,但我只需要从联合中选择所有内容,因为关注者表仅用于将 news_posts 与用户匹配。
    • @MCG - 您可以发布您的小提琴示例的预期结果吗?
    • 我正在使用用户名的 union 列查找所有 News_posts 列(message、type、poster_id)。我试图弄清楚如何只从服务器和/或当前登录用户关注的其他用户中选择 News_Posts,并在关注者表中表示。我不需要返回任何关注者表信息,因为它仅用于检查要为每个用户检索的 news_posts。编辑:我粘贴的查询 #1 返回我需要的所有内容,但它显示所有记录,而不是只显示给定 user.id 的服务器/用户的记录。
    猜你喜欢
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2016-04-27
    • 2012-01-28
    相关资源
    最近更新 更多