0

私のサイトには、あるユーザーが別のユーザーにメッセージを送信できるメッセージ機能があります。メッセージはスレッド化をサポートします。親メッセージは任意の数の子を持つことができますが、深さは 1 レベルのみです。

メッセージ テーブルは次のようになります。

Messages
 - Id (PK, Auto-increment int)
 - UserId (FK, Users.Id)
 - FromUserId (FK, Users.Id)
 - ParentMessageId (FK to Messages.Id)
 - MessageText (varchar 200)

各「親」メッセージの後に子メッセージの折りたたまれたビューが続くページにメッセージを表示したいと思います。

GROUP BY 句または同様の構文を使用して、親メッセージと子メッセージをすべて 1 つのクエリで取得できますか? 現在、親メッセージのみを取得してから、それらをループし、それぞれに対して別のクエリを実行して、関連するすべての子メッセージを取得しています。

次のようなメッセージを受け取りたいです。

Parent1
 Child1
 Child2
 Child3
Parent2
 Child1
Parent3
 Child1
 Child2
4

2 に答える 2

3

これを試して。ページネーションのためにフロントエンドに保持されている変数を使用して、 range_ を置き換えることができます。

select child.MessageText from
(select @i:=@i+1 as range_, id, MessageText from messages, (select @i:=0) k where ParentMessageId is null order by id asc) parent 
left outer join messages child on (parent.id = child.ParentMessageId or parent.id = child.id)
where parent.range_ between 1 and 3;
于 2012-03-30T18:24:42.620 に答える
2

一時 ID を使用してメッセージを並べ替えることができます。メッセージが親の場合、一時 ID は ID と等しくなり、それ以外の場合、一時 ID は ParentMessageID と等しくなります。次に、一時IDで注文するだけです

SELECT Messages.*, 
CASE WHEN ParentMessageId IS NULL THEN Id ELSE ParentMessageId END AS tempId 
FROM Messages
ORDER BY tempId

編集

最初の 10 レコードが必要な場合は、最初に Id を取得してからクエリを実行できます

SELECT Messages.*, 
CASE WHEN ParentMessageId IS NULL THEN Id ELSE ParentMessageId END AS tempId 
FROM Messages
WHERE Messages.tempId IN (SELECT Messages.Id 
                      FROM Messages
                      WHERE ParentMessageId IS NULL
                      LIMIT 10
                      ORDER BY Messages.Id )
ORDER BY tempId

このようにして、最初の 10 件のメッセージからメッセージとそれぞれの子のみを取得します。

于 2012-03-30T16:51:47.217 に答える