2015-03-03 57 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