1

次のアクションを実行する MySQL クエリの作成に問題があります。

各スレッドのスレッド ID に等しいスレッド ID を使用して、最新の投稿 (最大のタイムスタンプ) のタイムスタンプ (降順) で順序付けされたスレッド テーブルからすべてのスレッド ID を選択します。したがって、基本的にはスレッドを調べて、MySQL にデータベースをチェックさせてスレッド 0 としましょう。次に、threadID が 0 のすべての投稿をチェックし、スレッド 0 内の投稿の最大のタイムスタンプに基づいてスレッド 0 を並べ替えます。次に、スレッド 1、スレッド 2 などに対してこれを繰り返し、それに応じて並べ替えます。

これは可能ですか?これは、フォーラムの「バンプ システム」効果を作成することです。このシステムでは、最近アクティブなスレッドが、そのスレッドが消滅するまで継続的にリストの一番上に移動し、その後、そのスレッドが一番下に落ちます。以前は、lastActivity タイムスタンプをスレッド テーブルに保存し、新しい投稿がスレッドに送信されたときにそれを更新する別の実装を使用していましたが、このクエリを使用すると作業がはるかに効率的になります。

どうもありがとう!ここに関連する 2 つのテーブルがあります: スレッドと投稿です。投稿には、所属するスレッドの ID を格納する threadID フィールドがあり、タイムスタンプ フィールドもあります。Threads には、投稿のスレッド ID に対応するフィールド threadID があります。

4

3 に答える 3

2
SELECT  *
FROM    threads t
LEFT JOIN
        posts p
ON      p.id =
        (
        SELECT  p.id
        FROM    posts pi
        WHERE   pi.threadID = t.threadID
        ORDER BY
                pi.timestamp DESC
        LIMIT 1
        )

インデックスをオンにposts (threadID, timestamp)すると、このクエリが大幅に改善されます。

ソリューションとは異なりGROUP BY、このクエリはすべてのフィールドを選択postsし、最新の に重複がある場合でも機能することに注意してくださいposts.timestamp

于 2009-04-07T16:05:53.340 に答える
2

以下は、過去にMySqlで機能しました。クエリに各スレッドについてさらに情報を含めたい場合は、 と に列を追加する必要がありSELECTますGROUP BY

select thread.threadID, max(comments.modifiedOn) as threadUpdated 
   from thread inner join comments on thread.threadID = comments.threadID 
   group by 1 
   order by 2 desc;

このクエリは、私の最新のコメントを注文したスレッドのリストである、プライマリ リクエストを処理します。コメントのないスレッドをそのまま返すことはありません。そのためには、結合を外部結合に変更する必要があります。

于 2009-04-07T16:05:58.927 に答える