2

次のキー フィールドを持つテーブルがあります: commentidcommenttimeparentid

コメントには と の 2 種類がregularありrepliesます。レギュラーにはparentid 0があります。返信の親 ID は、返信先のコメント ID と同じです。

group by と orderby でこれを理解したと思っていましたが、私の考えはうまくいきませんでした.SQLの知識が初歩的であるため、現在苦労しています。

同じ親IDを持つものを一緒にグループ化し、その親ID内でそれらも時間でソートすることを除いて、時間DESCで表示したいと思います。1 レベルのみの返信を許可します。

例として、次の順序でお願いします。

time3 commentid3 parentid0
time2 commentid2 parentid0
    parentid2 commentid4 time4 (this one is a reply)
    parentid2 commentid5 time5 (this one also reply)
time1 comment1 parentid0

試しSELECT * from comments GROUP BY parentid ORDER BY TIME DESCましたが、これはうまくいきませんでした。必要に応じて、別の列を追加できます。任意の提案をいただければ幸いです! どうも。

4

3 に答える 3

1

ここではいくつかの仮定をしています。コメントIDは自動インクリメントIDであると想定しているため、挿入順序は古いものから新しいものへとなります。自動インクリメントIDを使用していない場合、またはこれらのテーブルで何らかの部分保存機能がある場合、これは機能しません。ですから、それは一種の壊れやすいものです。

また、親である場合、parent_idはnullであると想定しています。

SELECT commentid, comment, time, parent_id, if(parent_id = 0, commentid, parent_id) thread 
FROM comments  
ORDER BY thread desc, time asc

とにかく、いくつかの情報を追加します。

Group Byグループ化列によってすべての行が1つの行にグループ化されるため、これは使用したいものではありません。Group By通常、行の値のカウントや合計などの集計計算に使用されます。

編集:

クエリを更新して時間ascで並べ替えました。これにより、通常のコメントが最初に配置され、次に親コメントの下に古いものから新しいものへの返信が表示されます。

于 2012-05-07T03:05:53.933 に答える
1

SQLクエリから「ツリーのような」結果を取得することはできません(方法はありますが、ここでは実際には使用できないようです)

できることは、通常のデータと返信からすべてのデータを取得することです(これは、「通常の」データは、多くの返信がある場合に複製されることを意味し、データを取得した後にそれらを処理して「ツリー」結果を取得する必要があることを意味します) )

結果はそのようになります

regular.time, regular.commentid, replies.commentid, replies.time

レギュラーにコメントがない場合、replies.commentid と reply.time は null になります。

クエリ(「セルフレフトジョイン」を使用)は次のようになります(現在は役に立たないように思われるフィールドをいくつか移動しました)

select 
regular.time as regulartime,
regular.commentid as regularid, 
replies.commentid as repliesid, 
replies.time as repliestime
from comments regular
left join comments replies on replies.parentid = parent.commentid
where regular.parentid = 0
order by regular.time desc, replies.time asc 

あなたの例に従って、あなたは得るべきです

time3 commentid3 null       null
time2 commentid2 commentid4 time4 (this one is a reply)
time2 commentid2 commentid5 time5 (this one also reply)
time1 commentid1 null       nulll
于 2012-05-07T08:50:34.737 に答える
1

データの両方のレイヤーを取得するには、元のコメントの最上位レイヤーの UNION と、可能な返信用の UNION が必要です。クエリの最初の部分の最初の列には、並べ替えのために 1 または 2 が保持されます。これは、特定の質問に対して元の投稿をグループの一番上に表示するために使用されます...その後、すべての返信が自然な順序で表示されます。

また、元の日付/時刻による適切なグループ化を維持するために、元の投稿コメント時刻を「2」の CommentType レコードで保持しているため、元の時刻の開始基準とまったく同じグループ化されたままになりますが、実際のコメントと時刻を取得しますそれぞれのソートに対する RESPONSE (エイリアス "r")。

select
      PreQuery.*
   from
      ( select
              '1' as CommentType,
              c.Time as OriginalTime,
              c.CommentID StartingCommentID,
              c.Comment,
              c.Time as LastTime,
              c.CommentID as EndCommentID
           from
              comments c
           where
              c.ParentID = 0
        UNION ALL
        select 
              '2' as CommentType,
              c.Time as OriginalTime,
              c.CommentID StartingCommentID,
              r.Comment,
              r.Time as LastTime,
              r.CommentID as EndCommentID
           from
              comments c
                 join comments r
                    on c.CommentID = r.ParentID
           where
              c.ParentID = 0 ) PreQuery
   order by
      PreQuery.OriginalTime DESC,
      PreQuery.StartingCommentID,
      PreQuery.CommentType,
      PreQuery.LastTime

これにより、探していると思われる結果が得られるはずです(わずかに変更されています)

CommentType  OriginalTime  StartingCommentID  Comment  LastTime  EndCommentID
1            Time3         ID3                Comm3    Time3     ID3  <-- ID 3 IS the start
1            Time2         ID2                Comm2    Time2     ID2  <-- ID 2 is the start of next
2            Time2         ID2                Comm4    Time4     ID4     <- ID4 is reply to orig ID2
2            Time2         ID2                Comm5    Time5     ID5     <- another reply to ID2
1            Time1         ID1                Comm1    Time1     ID1  <-- start of new comment ID1

したがって、すべての行で、2 列目と 3 列目は常に最初のコメントを開始する親 ID を表します...そして、コメント タイプ = 1 の場合、コメント、前回、および終了コメント ID は、コメント開始。コメントタイプ=2の場合、最終コメント、前回、終了コメントがRESPONSEレコードのIDになります。

于 2012-05-07T11:15:16.097 に答える