2015-03-03 2 views
1

Нужно получить уникальные профили, заказанные create_date. Существует следующий запрос:Postgresql отдельная проблема

SELECT DISTINCT profiles.id, COALESCE(occured_at, users_visitors.created_at, visitors.created_at) creation_date FROM "profiles" 
JOIN "visitors" ON "visitors"."profile_id" = "profiles"."id" 
LEFT JOIN events ON profiles.id = events.profile_id 
LEFT JOIN event_kinds ON event_kinds.id = events.event_kind_id 
LEFT JOIN users_visitors ON visitors.id = users_visitors.visitor_id 
WHERE (event_kinds.name = 'enter') AND "users_visitors"."user_id" = 2 
ORDER BY creation_date asc 

DISTINCT ON (profiles.id) не поможет, как только она должна быть использована для заказа. GROUP BY profiles.id, ... не работает.

Не могли бы вы помочь мне, пожалуйста?

+0

Но какое значение create_date вам нужно, если у profile.id несколько разных? Кроме того, переместите условия предложения WHERE в соответствующее предложение ON, если вы снова захотите LEFT JOIN. Как сейчас, эти два исполняются как обычные INNER JOIN. – jarlh

ответ

1

Работает ли это GROUP BY? Или какой create_date вы хотите - если не максимальный?

SELECT profiles.id, 
     MAX(COALESCE(occured_at, 
        users_visitors.created_at, 
        visitors.created_at)) creation_date 
FROM "profiles" 
    JOIN "visitors" ON "visitors"."profile_id" = "profiles"."id" 
    LEFT JOIN events ON profiles.id = events.profile_id 
    LEFT JOIN event_kinds ON event_kinds.id = events.event_kind_id 
         AND event_kinds.name = 'enter' 
    LEFT JOIN users_visitors ON visitors.id = users_visitors.visitor_id 
          AND "users_visitors"."user_id" = 2 
GROUP BY profiles.id 
ORDER BY creation_date asc 

Обратите внимание, как я переехал, где условия оговорка, чтобы получить LEFT JOIN «S работать как LEFT JOIN» с.

+0

спасибо, это именно то, что мне нужно! – MikeZ

Смежные вопросы