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