Как объединить эти два сложных запроса в один запрос без объединения? - PullRequest
2 голосов
/ 23 октября 2011
(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)

Должно быть очевидно, что последнее соединение одинаково в обоих запросах. Просто не знаете, как объединять или объединять.

Ответы [ 3 ]

2 голосов
/ 23 октября 2011

Некоторые объединения кажутся излишними:

  • discussions может быть присоединено к subscriptions непосредственно в столбце company_id;

  • posts может быть присоединен к subscriptions непосредственно в столбце analyst_id;

  • последнее присоединение к users в любом из SELECT не требуется, поскольку данные из этой таблицы не извлекаются и фильтр (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
1 голос
/ 23 октября 2011

Это не проверено, но попробуйте. Дайте мне знать, если это работает.

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
0 голосов
/ 23 октября 2011

Я думаю, что есть различия, которые я пропускаю, но если вы просто хотите, чтобы сообщение было первым или вторым без использования 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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...