2012-09-06 10 views
11

Mam następujące kwerendy, która działa świetnie w PostgreSQL 9.1:Postgres sprawie w celu za pomocą aliasu

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; 

Ale to, co chcę zrobić, to coś takiego:

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; 

I Otrzymaj następujący błąd: BŁĄD: kolumna "najnowsza_interakcja" nie istnieje

Wygląda na to, że nie mogę użyć tego aliasu dla agregatu latest_interaction w porządku według klauzuli z instrukcją CASE.

Czy są jakieś obejścia tego problemu?

Odpowiedz

19

Spróbuj owinąć go jako podzapytania:

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; 
+0

Idealne, właśnie tego szukam! – dwilkie

+0

jak to będzie w przypadku zmniejszenia porządku? pls ,,, Próbowałem, ale jego błąd składniowy! –

+0

@ X-Coder Po prostu użyj 'CASE ... END DESC' –

2

Instrukcja PG mówi wyrażenie ORDER BY:

Each expression can be the name or ordinal number of an output column (SELECT list item), or it can be an arbitrary expression formed from input-column values.

Rozwiązanie podzapytanie z @Mahmoud będzie działać, lub można utworzyć ZAMÓWIENIE PRZEZ przy użyciu oryginalnych kolumn messages.created_at lub phone_calls.created_at

Powiązane problemy