【问题标题】:How to combine these two complicated queries into one query without union?如何在没有联合的情况下将这两个复杂的查询合并为一个查询?
【发布时间】:2011-10-23 00:03:51
【问题描述】:
(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)

很明显,两个查询中的最后一个连接是相同的。只是不确定如何“或”连接在一起。

【问题讨论】:

  • 使用 UNION 有什么问题? (除了用 UNION ALL 替换 UNION 的可能性)
  • 基本上是为了干掉我的 SQL 查询。如果这不是两个查询,我还有其他更有效的操作。
  • 我也愿意“接受”一个指向一个地方的答案,该地方说连接不能被“或”在一起。
  • 联合有时可以合并。结果可能会更快,也可能不会。

标签: sql join union


【解决方案1】:

有些连接似乎是多余的:

  • discussions 可以直接在company_id 列上加入subscriptions;

  • posts 可以直接在analyst_id 列上加入subscriptions;

  • 在任一 SELECT 中最后一次连接到 users 是不必要的,因为没有从该表中检索到数据并且过滤器 (users.id = 6) 可以重新应用于 subscriptions.user_id。

    李>

所以,我可能会像这样重写查询:

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

【讨论】:

    【解决方案2】:

    这是未经测试的,但请尝试一下。让我知道它是否有效。

    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
    

    【讨论】:

      【解决方案3】:

      我认为我忽略了一些差异,但如果你只想要帖子,如果它在第一个或第二个而不使用 UNION 那么:

      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
      )
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 2011-06-28
      相关资源
      最近更新 更多