我有以下查询在Postgres 9.1中非常有效:
SELECT users.id, GREATEST( COALESCE(MAX(messages.created_at), '2012-07-25 16:05:41.870117'), COALESCE(MAX(phone_calls.created_at), '2012-07-25 16:05:41.870117') ) AS latest_interaction FROM users LEFT JOIN messages ON users.id = messages.user_id LEFT JOIN phone_calls ON users.id = phone_calls.user_id GROUP BY users.id ORDER BY latest_interaction DESC LIMIT 5;
但是我想做的是这样的:
SELECT users.id, GREATEST( COALESCE(MAX(messages.created_at), '2012-07-25 16:05:41.870117'), COALESCE(MAX(phone_calls.created_at), '2012-07-25 16:05:41.870117') ) AS latest_interaction FROM users LEFT JOIN messages ON users.id = messages.user_id LEFT JOIN phone_calls ON users.id = phone_calls.user_id GROUP BY users.id ORDER BY CASE WHEN( latest_interaction > '2012-09-05 16:05:41.870117') THEN 0 WHEN(latest_interaction > '2012-09-04 16:05:41.870117') THEN 2 WHEN(latest_interaction > '2012-09-04 16:05:41.870117') THEN 3 ELSE 4 END LIMIT 5;
而且我收到以下错误:错误:列“ latest_interaction”不存在
似乎我不能在CASE语句的order by子句中使用别名作为聚合的last_interaction的别名。
有什么解决方法吗?
尝试将其包装为子查询:
SELECT * FROM ( SELECT users.id, GREATEST( COALESCE(MAX(messages.created_at), '2012-07-25 16:05:41.870117'), COALESCE(MAX(phone_calls.created_at), '2012-07-25 16:05:41.870117') ) AS latest_interaction FROM users LEFT JOIN messages ON users.id = messages.user_id LEFT JOIN phone_calls ON users.id = phone_calls.user_id GROUP BY users.id ) Sub ORDER BY CASE WHEN( latest_interaction > '2012-09-05 16:05:41.870117') THEN 0 WHEN(latest_interaction > '2012-09-04 16:05:41.870117') THEN 2 WHEN(latest_interaction > '2012-09-04 16:05:41.870117') THEN 3 ELSE 4 END LIMIT 5;