0

メッセージの単純なデータベースを使用しています。

ID | 整数                     
 親 ID | 整数                     
 メッセージ | キャラクターバリエーション(140)       
 create_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 の結果に既に表示されているため、最後の 2 行は返されませんでした。)

ありがとう

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

私があなたの質問を誤解していない限り、メッセージの階層全体をたどる必要があります.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 に答える