2011-06-25 39 views
1

私はPHPとMySQLを使用して基本的なフォーラムを作っています。私はすべてのスレッドに対して1つのテーブルを使用しています。それはforum_postsと命名されています。これは、これらのフィールドがあります。高度なMySQLの注文

id, creator, time, title, message, thread_reply, forum_id, locked, sticky 

ポストはthread_replyがそれ以外の場合は0に設定され、その後、thread_replyはこの記事に返信がされていることをスレッドのidに設定されている新しいスレッドである場合。すべてのスレッドを表示しているページで、スレッドに返信された最後の投稿の時刻までにスレッドを並べ替える必要があります。私は、このクエリを使用しています:

SELECT `id`, `title`, `creator` FROM `forum_posts` WHERE `thread_reply` = 0 AND `forum_id` = 1 ORDER BY -`time` 

だけの問題ではなく、最後の返信がスレッドにあった時間の、スレッドが作成された時点で注文のみそのクエリです。私が何を話しているのか分からなければ、フォーラムのホームページを見て、スレッドが最後に投稿された時までにスレッドを注文する方法を見てください。

答えて

2

先週私はカスタムフォーラムを作った(phpbbは自分のニーズに合っていないため)。

私が最初に次のような構造助言する:ユーザーのための

  • テーブルを
  • カテゴリ(フォーラムのメインセクション)スレッドの
  • テーブルの
  • 表(これらは内部のカテゴリです)
  • テーブルについて投稿(これらは個々のスレッドにあります)

最後のアクションで投稿を並べ替えるには、 last_actionと呼ばれていたThreadsテーブルのield、またはそのラインに沿ったもの。

スレッドが最初に作成されるとき、私はその値を作成された日付に設定します。次に、投稿が編集されるか、その投稿に新しい投稿が追加されるたびに、その値が更新されます。これはあなたが次のことを行うことを意味します:

SELECT blah, blah, blah FROM threads WHERE cat=4 ORDER BY last_action DESC 

うまくいけば助けてください。

-1

最新の返信で注文することはできません。別の列(last_reply_timeなど)を追加して、新しいスレッドが投稿されるたびにそのフィールドをアプリケーションに更新させ、それによって注文する必要があります。

+0

または相関サブクエリを使用します。 –

+1

私は多くのフォーラムシステムを追加して、 "スレッド"データを "ポスト"データから分離しておくと、このような問題を解決しやすくなります。彼らは、それが入っているフォーラム、それを開始したユーザー、最後に返信された時間、そしてしばしば最後に追加されたIDなどのスレッドを含むテーブルを持っています。そして実際の投稿はまったく別のテーブルにあります。 –

0

使用

SELECT `op`.`id`, `op`.`title`, `op`.`creator` 
FROM `forum_posts` `op`, `forum_posts` `rep` 
WHERE (`op`.`thread_reply` = 0 OR `op`.`thread_reply` = `rep`.`id`) 
    AND `op`.`forum_id` = 1 
ORDER BY IF(`op`.`thread_reply` = 0, -`op`.`time`, -`rep`.`time`) 

基本的に私はここでやっていることは、適用し、ご注文いただいた場合、その時点での回答を見つけることです。

+0

これは、すべての投稿をランダムな順序でスレッドとして出力しました:o – Matt

0

あなたは可能性について持っている場合:

は、2つのテーブルを作成します。

スレッド:ID、件名、DATE_CREATED、date_last_reply ..

投稿:ID、thread_idは、日付、 ..

SELECT * FROM threads ORDER BY date_last_reply 
1

最も簡単な方法は、テストthread_reply=0を使用した場合は、thread_reply=idというテストを使用します。スレッドの開始スレッドを自分自身への応答にします。あなたが何か他のもののために、それは少し厄介になるかもしれないが、あなたは、このように最初のサブクエリが不要であることを

SELECT * FROM 
    (SELECT `id`, `title`, `creator`, b.rtime FROM `forum_posts` 
     WHERE a.`thread_reply` = a.`id` AND `forum_id` = 1) a 
    LEFT JOIN (SELECT `thread_reply`, MAX(`time`) rtime FROM `forum_posts` 
     WHERE `forum_id`=1 
     GROUP BY `thread_reply`) b ON a.`id`=b.`thread_reply` 
    ORDER BY `rtime` DESC 

ノートのようなものを行うことができます使用している場合は、しかし、それはおそらく、フォーラムによる最初のフィルタに、より効率的で、 "それは最初の投稿ですか?"

またORDER BY time DESCを使用できる場合はORDER BY -time ASCを使用してください。

しかし、はい、おそらく、トピックのテーブルと返信用のテーブルを持つのが最も良い方法です。