0

我正在处理一个简单的消息数据库。

编号 | 整数                     
 parent_id | 整数                     
 味精 | 性格变化(140)       
 创建_dte | 数字(10,0)

消息的 parent_id 为 -1(顶级)或另一条消息的 id。我想返回最近的顶级消息——最近定义为父级或其任何子级的最近 create_dte。

这是我的查询:

select (case when parent_id != -1 then parent_id else id end) as mid, create_dte
from messages
order by create_dte desc

我的结果是这样的:

中 | create_dte
------+----------------------
 5655 | 1333906651
 5462 | 1333816235
 5496 | 1333686356
 5157 | 1333685638
  第676章 1333648764
 5493 | 1333648630
  第724章 1333641318
 5402 | 1333470056
 5397 | 1333468897
 5396 | 1333468378
 3640 | 1333304212
 3434 | 1333300366
 2890 | 1333293369
 4958 | 1333288239
 4899 | 1333287641
 5203 | 1333287298
 4899 | 1333287275
 4899 | 1333285593

如何在保持 create_dte 类型的同时消除结果中的重复项?我已经尝试过不同的和不同的,但总是失去排序。

这是我需要的:

中 | create_dte
------+----------------------
 5655 | 1333906651
 5462 | 1333816235
 5496 | 1333686356
 5157 | 1333685638
  第676章 1333648764
 5493 | 1333648630
  第724章 1333641318
 5402 | 1333470056
 5397 | 1333468897
 5396 | 1333468378
 3640 | 1333304212
 3434 | 1333300366
 2890 | 1333293369
 4958 | 1333288239
 4899 | 1333287641
 5203 | 1333287298

(最后两行未作为 4899 返回的结果中已经出现了更新的 create_dte。)

谢谢

4

2 回答 2

2

尝试以下操作:

select (case when parent_id != -1 then parent_id else id end) as mid, max(create_dte )
from messages 
group by case when parent_id != -1 then parent_id else id end
order by max(create_dte) desc;
于 2012-04-10T06:00:42.130 回答
1

除非我误解了您的问题,否则您需要遍历任何消息的整个层次结构,您将需要一个递归查询来获取一个“根”消息 ID 的所有消息。一旦你有了它,它就是 create_dte 上的一个简单的 max():

with msg_tree as (
    select id as root_id,
           id, 
           parent_id,
           create_dte
    from messages
    where parent_id = -1

    union all 

    select p.root_id,
           c.id,
           c.parent_id,
           c.create_dte
    from messages m 
        join msg_tree p on p.id = m.parent_id
)             
select root_id, 
       max(create_dte)
from msg_tree
group by root_id
order by 2;
于 2012-04-10T07:14:22.407 回答