0

我无法将几个 sql 语句组合成一个更大的单个语句。

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

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

重要列:[user_id,following_id,类型]

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

重要列:[用户名]

服务器(用户也可以关注服务器帐户。请注意,用户的服务器是一对多的,因为用户可以创建 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

4

2 回答 2

2

您正在询问由 ID 为1的用户的帐户(用户或服务器)发布的所有新闻帖子。您需要有关这些帖子的所有信息以及发布者的用户名或服务器标题。这就是在 SQL 中,给定您的架构(也在 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 表。

于 2013-02-27T19:51:00.940 回答
0

你的意思是这样的吗?

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

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

于 2013-02-27T19:42:39.417 回答