私のサイトには、ほぼ完璧なシンプルなフォーラムがあります。近いけどまだ遠い…
次の SQL は、ユーザーがスレッドと返信者の概要を表示できるフォーラムのフロント ページ ビューを作成するために使用されます。
SELECT COUNT(forumtopics.forumtopicline) AS totalthreads
, forumtopicline
, forumtopics.whenadded AS threaddate
, forumtopics.whoadded AS author
, forumtopics.title
, COUNT(forumreply.forumtopic) AS replies
, MAX(forumreply.whenadded) AS replydate
, forumreply.whoadded AS replier
FROM forumtopics
LEFT JOIN forumreply ON forumtopicline = forumreply.forumtopic
WHERE forumtopics.topic LIKE '%%'
OR forumtopics.title LIKE '%%'
OR forumreply.reply LIKE '%%'
GROUP BY forumtopicline
ORDER BY
CASE
WHEN COUNT(forumreply.forumtopic) > 0 THEN MAX(forumreply.whenadded)
WHEN COUNT(forumreply.forumtopic) = 0
OR forumreply.forumtopic IS NULL THEN MAX(forumtopics.whenadded)
END
DESC
LIMIT 0 , 30
ほぼ完璧に仕事をします。これにより、スレッドが開始された日付、スレッドの作成者、および最後の返信の日付が提供され、最新の返信が一番上にある投稿で正しくランク付けされます。
問題は
MAX( forumreply.whenadded ) AS replydate, forumreply.whoadded AS replier
これは、スレッドへの最後の投稿の日付を返しますが、日付に関係なく最初の応答者の名前を返します。アプリケーション レベルの操作を回避するために、このかなり洗練された SQL を完成させる方法が必要であると確信しています。感謝して受け取った助け。明らかに、forumreply.whoadded が MAX(forumreply.whenadded) と同じ行にある必要があります。
DB=Mysql. スキーマ:
CREATE TABLE forumtopics (
forumtopicline SERIAL
,title VARCHAR(256)
,topic TEXT
,whenadded DATETIME
,whoadded VARBINARY(128)
,whenaltered DATETIME
,whoaltered VARBINARY(128)
,inuse BOOL
);
CREATE TABLE forumreply (
forumreplyline SERIAL
,forumtopic BIGINT
,reply TEXT
,whenadded DATETIME
,whoadded VARBINARY(128)
,whenaltered DATETIME
,whoaltered VARBINARY(128)
,inuse BOOL
);