Sql 如何在没有联合的情况下将这两个复杂的查询组合成一个查询?
很明显,两个查询中的最后一个联接是相同的。。只是不确定如何将“或”连接在一起。这是未经测试的,但请尝试一下。让我知道它是否有效Sql 如何在没有联合的情况下将这两个复杂的查询组合成一个查询?,sql,join,union,Sql,Join,Union,很明显,两个查询中的最后一个联接是相同的。。只是不确定如何将“或”连接在一起。这是未经测试的,但请尝试一下。让我知道它是否有效 (SELECT posts.id FROM posts INNER JOIN discussions ON discussions.post_id = posts.id INNER JOIN companies ON discussions.company_id = companies.id INNER JOIN subscriptions ON subscrip
(SELECT posts.id FROM posts
INNER JOIN discussions ON discussions.post_id = posts.id
INNER JOIN companies ON discussions.company_id = companies.id
INNER JOIN subscriptions ON subscriptions.subscribable_id = companies.id AND subscriptions.subscribable_type = 'Company'
INNER JOIN users ON subscriptions.user_id = users.id WHERE users.id = 6)
UNION
(SELECT posts.id FROM posts
INNER JOIN users users_2 ON posts.analyst_id = users_2.id
INNER JOIN subscriptions ON subscriptions.subscribable_id = users_2.id AND subscriptions.subscribable_type = 'User'
INNER JOIN users ON subscriptions.user_id = users.id WHERE users.id = 6)
我想我忽略了其中的差异,但如果你只是想在第一个或第二个职位上发表文章,而不使用工会,那么:
select posts.id
from posts
inner join discussions
on discussions.post_id = posts.id
inner join companies
on discussions.company_id = companies.id
inner join subscriptions
on subscriptions.subcribable_id = companies.id
inner join users
on subscriptions.user_id = users.id
or users.id = posts.analysis_id
where subscriptions.subscribable_type in ('Company', 'User')
and users.id = 6
有些连接似乎是多余的:
可以直接加入讨论
列上的公司id
订阅
可以直接加入帖子
栏上的分析师id
订阅
- 由于没有从该表检索到任何数据,并且筛选器(
)可以重新应用于users.id=6
,因此不需要在任一选择中最后一次加入到订阅。user\u id
users
SELECT posts.id FROM posts
where posts.id IN
(
SELECT posts.id FROM posts
INNER JOIN discussions ON discussions.post_id = posts.id
INNER JOIN companies ON discussions.company_id = companies.id
INNER JOIN subscriptions ON subscriptions.subscribable_id = companies.id AND subscriptions.subscribable_type = 'Company'
INNER JOIN users ON subscriptions.user_id = users.id WHERE users.id = 6
)
or
posts.id IN
(
SELECT posts.id FROM posts
INNER JOIN users users_2 ON posts.analyst_id = users_2.id
INNER JOIN subscriptions ON subscriptions.subscribable_id = users_2.id AND subscriptions.subscribable_type = 'User'
INNER JOIN users ON subscriptions.user_id = users.id WHERE users.id = 6
)
使用工会有什么不对?(可能除了用UNIONALL替换UNION的可能性)基本上是为了使我的SQL查询干涸。如果这不是两个问题,我还有其他更有效的操作。我也愿意“接受”一个指向某个地方的答案,即连接不能“或”组合在一起。有时可以组合工会。结果可能更快,也可能更快。原始查询也不会包含重复项,因为UNION暗示DISTINCT(与UNION ALL不同)。您是对的,从不知道UNION暗示DISTINCT:
SELECT p.id
FROM posts p
INNER JOIN discussions d ON d.post_id = p.id
INNER JOIN subscription s
ON s.subscribable_type = 'Company' AND s.subscribable_id = d.company_id
OR s.subscribable_type = 'User' AND s.subscribable_id = p.analyst_id
WHERE s.user_id = 6