Как соединить эти два запроса в один?

Здравствуйте. Уже битый час пытаюсь и так, и этак сделать, гугл истерзал на предмет манов и примеров, но всё равно туплю…

id пользователя — 1.

SELECT calendar.* FROM calendar /* Таблица событий */
INNER JOIN subscribes_fields /* Таблица, где содержатся записи подписок на площадки */
ON calendar.id_object = subscribes_fields.id_field /* В id_object записываются id, в данном случае мы ищем id площадок */
WHERE subscribes_fields.id_follower = 1 AND calendar.type = 'field' /* Соответственно, id подписчика — наш, тип события выставлен для площадки, так как айдишники могут быть и от других таблиц и типов */

SELECT calendar.* FROM calendar /* Таблица событий */
INNER JOIN subscribes_events /* Таблица, где содержатся записи подписок на события */
ON calendar.id = subscribes_events.id_event /* Тут проще, подписки на события сразу содержат прямой id события*/
WHERE subscribes_events.id_follower = 1 AND subscribes_events.type = 'user' /* Где подписчик — наш пользователь, тип подписки — пользователи */

Помогите, пожалуйста, соединить эти два запроса в один?
  • Вопрос задан
  • 4897 просмотров
Решения вопроса 1
vovich
@vovich
select calendar.* left join subscribers_fields ON calendar.id_object = subscribes_fields.id_field AND subscribes_fields.id_follower = 1 AND calendar.type = 'field' left join JOIN subscribes_events ON calendar.id = subscribes_events.id_event and subscribes_events.id_follower = 1 AND subscribes_events.type = 'user' where subscribers_fields.Id is not null OR subscribes_fields.id_field is not null
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Melkij
@Melkij
PostgreSQL DBA, contributor
SELECT calendar.* FROM calendar /* Таблица событий */
 INNER JOIN subscribes_fields /* Таблица, где содержатся записи подписок на площадки */
 ON calendar.id_object = subscribes_fields.id_field /* В id_object записываются id, в данном случае мы ищем id площадок */
join JOIN subscribes_events ON calendar.id = subscribes_events.id_event and subscribes_fields.id_follower=subscribes_events.id_follower
 WHERE subscribes_fields.id_follower = 1 AND calendar.type = 'field'


?
Это на сколько я понял вашу структуру таблиц и связей.
Ответ написан
psylostlife
@psylostlife Автор вопроса
Собственно, сократив:

SELECT calendar.*
FROM calendar AS c
LEFT JOIN subscribes_fields AS f
ON c.id_object = f.id_field
AND f.id_follower = 1
AND c.type = 'field'
LEFT JOIN subscribes_user_teams AS t
ON c.id_object = t.id_team
AND t.id_follower = 1
AND c.type = 'team'
LEFT JOIN subscribes_events AS e
ON c.id = e.id_event
AND e.id_follower = 1
AND e.type = 'user'
WHERE ((f.id IS NOT NULL OR f.id_field IS NOT NULL) 
  OR (t.id IS NOT NULL OR t.id_team IS NOT NULL))
  AND c.d_start = 17
  AND c.m_start = 11
  AND c.y_start = 2012
Ответ написан
@anitspam
хочу заметить, что иногда два запроса по одному join могут работать быстрее, чем один с двумя join.
вдруг с ростом проекта столкнётесь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы