1

スケッチからフォーラム システムを構築する必要があるプロジェクトに取り組んでいます

ただし、SQLに関する問題に直面しています

Derby データベースを使用しています。

テーブル構造は次のとおりです。

 

TABLE フォーラムのスレッド (
    TID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (1 で開始、1 ずつ増加) 主キー、
    TTitle varchar(50) NOT NULL,
    UID 整数 NOT NULL,
    CID Char(7) NOT NULL,
    スティッキー ブール値 null 以外、
    ステータス文字(1)
)

==========スレッドの内容と返信========
TABLE ForumThreadContent (
    RID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (1 で開始、1 ずつ増加) 主キー、
    Rcontent varchar(10000) 非ヌル、
    RTime タイムスタンプが Null でない、
    REditTime タイムスタンプ、
    UID 整数 NOT NULL,
    TID 整数 NOT NULL、
    ステータス文字(1)
)


TABLE ユーザー (
   UID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (1 で開始、1 ずつ増加) 主キー、
   UName varchar(50) NOT NULL,
   UNick varchar(50) 非ヌル、
   ULoginName varchar(16) NOT NULL,
   Upwd varchar(16) NOT NULL,
   UPic varchar(200)、
   UType Char(1) NOT NULL

)

=========外部キー==========
ALTER TABLE フォーラムスレッドコンテンツ
制約を追加 Forum_reply_fk_thread 外部キー (TID) 参照 ForumThread(TID);
Alter Table フォーラムスレッド
制約追加 forum_thread_fk_User 外部キー (UID) 参照ユーザー (UID);

フォーラムで単一のスレッドを表示する UI デザインには、次の情報が表示されます。各ページに 10 個のスレッドを表示

  • スレッドのタイトル (ForumThread.TTitle)
  • スレッド作成者 (Users.UNick)
  • そのスレッドの返信数
  • 最新の返信時間 (ForumThreadContent RTime)
  • 最新の返信者のニックネーム (Users.UNick)

私のSQL文。

SELECT ftc.tid ,ft.TTitle, ss.uNick as "Author", s.Unick as "Last replied by" , MAX(ftc.RTIME) as "Last Reply Time", COUNT(*) AS "Posts Count"
FROm ForumThreadContent ftc, Users s, ForumThread ft, Users ss
WHERE ftc.UID = s.UID
      AND ftc.TID = ft.TID 
      AND ft.UID = ss.UID
Group by ftc.tid , ft.ttitle , s.uNick , ss.uNick
Having MAX(ftc.RTIME) IN (SELECT MAX(ftcc1.RTime) 
                      FROM ForumThreadContent ftcc1 
                      WHERE ftc.TID = ftcc1.tid)

このステートメントはエラーなしで実行できます。TID "1" に 3 つの応答があると仮定すると、実行すると、COUNT(*) は tid: 1 の "2" のみをカウントします。明確にするために:

  • ForumThreadContent の 3 行には、TID の外部キー「1」があります。
  • 3行の最初の行は、UIDの外部キー「1」を持っています
  • 残りはUIDの外部キー「2」を持つ

この状況で count() 関数を正しく実行することは可能ですか? SQL で 2 より大きい数値を取得することはできません。

4

1 に答える 1

1

これはあなたのために働くかもしれません。一度列名を確認してください

SELECT t1.tid, t1.Title, t1.Author, s1.Unick as 'Last replied by', ftc1.Rtime as 'last reply time', t1.count
FROM
(SELECT ftc.tid, ft.Title, s.UID, s.Unick as 'Author', COUNT(*) as count FROM 
ForumThreadContent ftc, Users s, ForumThread ft
where ftc.TID = ft.TID
and ft.UID = s.UID
group by ftc.tid, ft.title, s.UID) t1, Users s1, ForumThreadContent ftc1
where ftc1.rtime = (select max(rtime) from ForumThreadContent ftc2 where ftc2.tid = t1.tid)
and ftc1.uid = s2.uid
于 2013-11-04T11:28:59.040 に答える