1

私はただPHPを学んでいますが、ここで完全に迷っています。これまで join を実際に使用したことがなく、ここで使用する必要があると思いますが、わかりません。誰かが私のためにそれをしてくれるとは思っていませんが、もしあなたが私を正しい方向に向けることができれば、それは素晴らしいことです.結合について読んでみましたが、20の異なる方法があり、私はただ迷っています.

基本的に、私はフォーラムを手作業でコーディングしました。うまく機能しますが、効率的ではありません。

board_posts (投稿用) と board_forums (フォーラム用、カテゴリとセクション用) があります。

私がやり直している部分は、インデックス ページの最後の投稿の情報を取得する方法です。私が設定した方法は、結合の使用を避けるために、最新の投稿の情報をboard_forumsのテーブルに保存することです。そのため、「オフトピック」と呼ばれるセクションがあるとします。「forum_lastpost_username/userid」のフィールドがあります/posttitle/posttime" ユーザーが投稿したときに更新しますが、これは悪いことです。すべてを動的に取得して、それらのフィールドを削除しようとしています。

現在、私のクエリは次のようになっています。

`SELECT * FROM board_forums WHERE forum_parent='$forum_id''

そして、そのフォーラムの情報 (名前、説明など) を取得するものがあり、最後の投稿のすべてのデータがそこにあります。

    $last_thread_title = $forumrow["forum_lastpost_title"];
    $last_thread_time = $forumrow["forum_lastpost_time"];
    $lastpost_username = $forumrow["forum_lastpost_username"];
    $lastpost_threadid = $forumrow["forum_lastpost_threadid"];

しかし、私はそれを取り除き、board_posts から取得する必要があります。board_posts での設定方法は、それがスレッドの場合、post_parentpost は NULL であり、返信の場合、そのフィールドにはスレッドの ID (トピックの最初の投稿) が含まれます。したがって、最新の post_date を取得し、どのユーザーがそれを投稿したかを確認し、parentpost が NULL かどうかを確認する必要があります (null の場合、最後の投稿は新しいスレッドであるため、タイトルとユーザーのすべての情報を取得できますが、そうでない場合は、そのスレッドの最初の投稿の情報 (タイトル、ID) を取得する必要があります (これは、post_parentpost が何であるかを確認し、その ID を検索して、そこからタイトルを取得することで見つけることができます。

それは意味がありますか?もしそうなら、私を助けてください:(

どんな助けでも大歓迎です!!!!

4

4 に答える 4

3

投稿または返信が挿入されるたびに board___forums を更新することは、パフォーマンスに関しては、最悪のアイデアではありません。インデックス ページを表示するには、1 つのテーブル board_forums からデータを選択するだけで済みます。これは、2 番目のテーブルを選択して「最後の投稿の情報」を取得するよりも、巧妙な結合を使用した場合でも、はるかに高速です。

于 2008-12-18T23:55:13.173 に答える
1

あなたはすでに正しいことをしているようです。

参加する場合は、次のようにします。

SELECT * FROM board_forums
JOIN board_posts ON board_posts.forum_id = board_forums.id
WHERE forum_parent = '$forum_id'

それに関する問題は、それがあなたにすべての投稿を取得することです、それは役に立ちません(そして非常に遅いです)。あなたがしたいことはこのようなものです

SELECT * FROM board_forums
JOIN board_posts ON board_posts.forum_id = board_forums.id ORDER BY board_posts.id desc LIMIT 1
WHERE forum_parent = '$forum_id'

SQLがそのように機能しないことを除いて。結合を注文したり制限したりすることはできません(またはそのような他の多くの便利なことを行うことはできません)。そのため、すべての行をフェッチしてから、コードでスキャンする必要があります(これは最悪です)。

要するに、心配しないでください。すべてのフォーラムとすべての投稿を1回のヒットでロードする実際のケースでは、結合を使用します。

于 2009-02-19T02:27:57.837 に答える
1

各アクション、新しい投稿、投稿の削除などの統計を更新する方が良いでしょう。

他のインスタンスでは、統計の更新は必要ない可能性があります(スレッドを削除すると、フォーラムの更新がトリガーされ、トピック数のトピックが1つ少なくなります)。

ユーザーが実行するすべてのアクションについて考えてください。ほとんどの場合、統計を更新する必要はありません。したがって、その場でカウントを取得することは非常に非効率的であり、そう考えるのは正しいことです。

于 2008-12-19T12:40:08.663 に答える
0

単純な解決策では、すでに発見されているように、いくつかのオプションのクエリが多数発生します。

これに対する古典的なアプローチは、結果をキャッシュし、たまにしか取得しないというものです。キャッシュは長く存続する必要はありません。忙しいサイトでは 2 ~ 3 秒でも大きな違いがあります。

とにかく、すでに読んでいるテーブルにデータを非正規化すると役立ちます。このアプローチにより、オプションのクエリを考え出す手間が省け、挿入が既に行われているときに更新を 1 回行うだけなので、少し安上がりになる可能性があります。ただし、一部のデータの整合性はアプリケーションに移行します。

余談ですが、スレッドで再帰クエリの問題が発生している可能性があります。「単純な」アルゴリズムを使用する場合、リレーショナルデータベースは階層データをうまく保存しません。より良い方法は、「セット ツリー」と呼ばれることもあります。残念ながら、Google で検索するのは少し難しいので、ここ いくつかの リンクを示します

于 2009-02-19T02:08:27.897 に答える