0

フォーラム Web サイトのコーディングを試みており、スレッドのリストを表示したいと考えています。各スレッドには、最初の投稿 (スレッドの「ヘッド」) と最後の投稿に関する情報を添付する必要があります。私の現在のデータベース構造は次のとおりです。

threads table:
id   - int, PK, not NULL, auto-increment
name - varchar(255)

posts table:
id        - int, PK, not NULL, auto-increment
thread_id - FK for threads

テーブルには他のフィールドもありますが、クエリには関係ありません。私は、単一のクエリ (サブクエリなし) で各スレッドの最初と最後の投稿の両方を取得するように、クエリthreadsを実行して何らかのJOIN方法で処理することに興味があります。postsこれまでのところ、複数のクエリを使用してそれを行うことができ、最初の投稿を次のように定義しました。

SELECT *
FROM threads t
LEFT JOIN posts p ON t.id = p.thread_id
ORDER BY p.id
LIMIT 0, 1

最後の投稿は、を除いてほとんど同じですORDER BY id DESCこれで、次のようにして、最初または最後の投稿で複数のスレッドを選択できました。

SELECT *
FROM threads t
LEFT JOIN posts p ON t.id = p.thread_id
ORDER BY p.id
GROUP BY t.id

ASCしかしもちろん、両方を同時にソートする必要があるため、両方を同時に取得することはできませんDESC
ここでの解決策は何ですか?単一のクエリを使用することさえ可能ですか? これを容易にするためにテーブルの構造を変更する方法はありますか? これが不可能な場合、この特定の状況でクエリのパフォーマンスを向上させるためのヒントを教えてください。

4

1 に答える 1

1

サブクエリと結合で何かを行うことができます:

SELECT first.text as first_post_text, last.text as last_post_text
FROM
  (SELECT MAX(id) as max_id, MIN(id) as min_id FROM posts WHERE thread_id = 1234) as sub
JOIN posts first ON (sub.max_id = first.id)
JOIN posts last ON (sub.min_id = last.id)

しかし、それはサブクエリなしでそれを行うという問題を解決しません。

各スレッドの最初と最後の投稿の ID を保持するように、スレッド テーブルに列を追加できます。最初の投稿は変更されませんが、新しい投稿を追加するたびにスレッド テーブルのレコードを更新する必要があるため、書き込みが 2 倍になり、競合状態を回避するためにトランザクションを使用する必要がある場合があります。

または、スレッド行の最初と最後の投稿に関する情報を複製することもできます。投稿者の user_id、投稿されたタイムスタンプ、投稿の最初の 100 文字が必要だとします。スレッド テーブルに 6 つの新しい列を作成して、最初と最後の投稿のデータを含めることができます。データが重複しますが、posts テーブルにまったくクエリを実行する必要なく、スレッドのリストを表示できる可能性があることを意味します。

于 2012-09-01T21:37:23.147 に答える