mysql - 外部和内部 SQL 连接

标签 mysql sql union inner-join

我在将多个 sql 语句合并为一个较大的单个语句时遇到问题。

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

关注者(列出用户及其关注的帐户以及所关注的帐户类型)

重要列:[user_id、following_id、type]

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

重要列:[用户名]

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

重要列:[标题]

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

重要列:[poster_id、消息、类型]

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

查询 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

最佳答案

您要求提供 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 表。

关于mysql - 外部和内部 SQL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15120354/

相关文章:

database - PostgreSQL 中的联合

mysql - MySQL 中的嵌套联合语句

php - 如何按特定月份/年份选择记录

php - SQL中的匹配兴趣(最近邻)搜索

sql - postgresql 在哪里约束 View 并将结果发送到函数?

sql - Laravel 连接到 sql server

mysql - 加速连接两个巨大表的查询

mysql - SQL 性能 UNION 与 OR

mysql - 搜索特定行中的文本

php - 如何统计MySQL中最畅销的产品?