1

だから私は簡単なフォーラムを構築しようとしています。トピックの日付 (返信がない場合) または最新の返信のいずれかで降順のトピックのリストになります。DB構造は次のとおりです。

フォーラム_トピック

ID、名前、メール、本文、日付

フォーラム_返信

ID、メール、本文、日付、topic_id

フォーラム自体は、次のヘッダーを持つ HTML テーブルで構成されます。

トピック、最終更新日、返信数

そのような構造を生成するクエリはどのように見えるでしょうか? クロス結合が必要だと思っていましたが、よくわかりません...よろしくお願いします。

4

4 に答える 4

3

ややこのように:

select * from forum_topic
inner join forum_reply on forum_topic.id=topc_id

ただし、使用しないでくださいselect *

それは悪い習慣です:)

そして、私はあなたが正規化を避ける方法が好きではありません! 私がむしろ持っている意味:

ユーザー

  • ユーザーID
  • 名前
  • Eメール

スレッド

  • スレッド ID
  • 主題
  • 回答済み
  • AskedByUserID
  • 日にち

返信

  • 返信ID
  • スレッド ID
  • ユーザーID
  • 答え
  • 日にち

次に、次のようにスレッドを選択します。

select ThreadID, Subject, Answered, AksedByUserID, Date from Threads

そして、このようなすべての返信を選択します

select Answer, Date, Name, Email from Threads
inner join Replies on Threads,ThreaID=Replies.ThreadID
inner join Users on AskedByUserID=UserID 
where Threads.ThreadID=xxx

これは私の頭のてっぺんから書いたものですが、group by も追加する必要があるかもしれません。

于 2009-01-03T16:50:25.910 に答える
1

まず、あなたの質問に実際に答えている人は誰もいないようです。

そのような構造を生成するクエリはどのように見えるでしょうか?

の要求された構造を持つ

トピック、LastModified、返信数。

指定したテーブル構造が与えられた場合、その構造を持つ結果テーブルを生成するための SQL は次のようになります。

SELECT t.Id, t.Name AS Topic, 
       MAX(r.Date) AS LastModified, 
       COUNT(*) AS NumReplies
FROM Forum_Topic t
LEFT OUTER JOIN Forum_Reply r ON t.id = r.topic_id
GROUP BY t.Id, t.Name

(申し訳ありませんが、現時点ではMySqlにアクセスできないため、これはSQL Serverでのみテストされています)

また、あなたの構造すでに正規化されています。反対の提案は、何をしたいのかについて仮定を立てることです。たとえば、電子メール アドレスに加えてユーザー名を追跡することに関心があると仮定します。これは非常に合理的ですが、それでも仮定です。正規化の観点からは、電子メール アドレスを一意のユーザー識別子として使用することに問題はありません。

さて、データベースのセットアップ方法に関する一般的な提案を探している場合は、それらの多くを提供できます。正規化する前に、可能性のあるキーワードをオブジェクト名として使用しないことから始めます (たとえば、'Name' や 'Date' などの列名を付けないでください)。

応答がない場合に値が NULL であるという Matt からのコメントについては、COALESCE() 関数を使用すると修正されます。COALESCE() は、最初の非 NULL 引数 (またはすべての引数が NULL の場合は NULL) を返します。したがって、MAX(r.Date) を MAX(COALESCE(r.Date, t.Date)) に置き換えます。

于 2009-01-03T20:39:58.410 に答える
1

はい、次のようなクエリで取得できるはずです。

SELECT 
  forum_topic.id, 
  forum_topic.name AS Topic,  
  MAX(forum_reply.date) AS Last_Modified, 
  count(*) AS  Replies
FROM forum_topic 
INNER JOIN forum_reply ON (forum_topic.id=forum_reply.topic_id)
GROUP BY forum_topic.id

"group by" は、トピックごとに 1 つの行を提供する魔法であり、MAX()およびCOUNT()関数が必要な集計データを提供します。

(編集: 最初の投稿の本文がトピック テーブルにあることを見逃していたため、返信のない投稿は上記のクエリでは見逃されてしまいます。Filip は、データを正規化することを提案する正しい考えを持っています。正規化すると、上記のようなクエリが必要なデータが得られます)。

于 2009-01-03T16:50:57.483 に答える
0

「正規化」とは、「forum_topic」の本文列を削除し、実際のトピック本文を最初の返信にするという意味ですか?

于 2009-01-03T17:19:22.373 に答える