2015-03-03 62 views
1

它需要接收由creation_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

但是,如果profiles.id有幾個不同的值,你需要哪個creation_date值?此外,如果您重新設置想要的LEFT JOIN,則將WHERE子句條件移至相應的ON子句。現在這兩個執行像普通的INNER JOIN一樣。 – jarlh 2015-03-03 11:01:47

回答

1

這個GROUP BY是否工作?或者你想要哪個creation_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 

注意我是如何移動的where子句條件得到LEFT JOIN的爲LEFT JOIN執行的。

+0

謝謝,這正是我需要的! – MikeZ 2015-03-03 11:23:46