2013-12-18 94 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 –