我在将多个 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/