2013-12-18 218 views
0

我有這樣的查詢:SELECT DISTINCT查詢/子查詢

SELECT user_set, read, last_updated, user_id, pk_id 
FROM interaction_log 
WHERE user_id = 2002 
ORDER BY read, last_updated, user_set 

使用的數據庫是PostgreSQL的(9.1),並且要求是這樣的:

  • 列的排序可能不會更改(按讀取狀態排列,然後按最後更新排序,然後按user_set排列)
  • 「讀取」列是一個整數,它只能取值爲'1'或'0'。 last_updated是一個正整數,user_set是一個字符串。
  • user_set列必須是唯一的。例如:如果有3個條目用於user_set命名如 '開發者' 下面:

    1. user_set = 「開發者」,讀= 1,LAST_UPDATED = 10,USER_ID = 2002,pk_id = 1
    2. user_set =「開發者」,讀= 0,LAST_UPDATED = 30,USER_ID = 2002,pk_id = 3
    3. user_set = 「開發者」,讀= 0,LAST_UPDATED = 20,USER_ID = 2002,pk_id = 2

然後第二個條目(帶有pk_id = 3)應該出現在最上面,而其他都不應該出現b因爲它是'讀= 0',然後它的last_updated值是30(高於20)。

SELECT DISTINCT ON(user_set)希望我有user_set作爲第一個排序順序,這將改變排序,因此我不能這樣做。

如果我做這樣的事情:

SELECT DISTINCT ON (user_set) user_set, read, last_updated, thread_id, user_id, id 
FROM message_interaction_log 
    WHERE (user_set, read, last_updated, thread_id, user_id, id) IN 
     (SELECT user_set, read, last_updated, thread_id, user_id, id 
      FROM message_interaction_log 
      WHERE user_id = 14 
      ORDER BY read DESC, last_updated, user_set) 

那麼「爲了通過」上「讀」的效果是不可見的,做「讀ASC」和「讀DESC」保持不變。

我試過盡我所能,每次都失敗了。任何幫助,我會非常感激。

+0

也許查找選擇MAX(列):http://www.postgresql.org/docs/9.3/static/tutorial-agg.html – mcalex

回答

1
SELECT user_set, read, last_updated, user_id, pk_id 
FROM message_interaction_log 
WHERE (user_set, last_updated) IN (
    SELECT user_set, max(last_updated) 
    FROM message_interaction_log 
    WHERE user_id = 2002 
    GROUP BY user_set 
) 

請參閱http://sqlfiddle.com/#!15/9a044/6

+0

ORDER BY子句添加到您的解決方案@Guntram :)非常感謝。自過去兩天以來,我一直在爲此而苦苦掙扎。我需要做更多的SQL我想。 :P –