0

私のサイトには、ほぼ完璧なシンプルなフォーラムがあります。近いけどまだ遠い…

次の 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
);
4

1 に答える 1

1

これを試して:

SELECT
    totalthreads,
    forumtopicline,
    threaddate,
    author,
    title,
    replies,
    replydate,
    (
        SELECT
            fr.whoadded
        FROM
            forumreply fr
        WHERE
            fr.forumtopic = forumtopicline
            AND fr.reply LIKE '%%'
            AND fr.whenadded = replydate
    ) as replier
FROM (
    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
) as tmp
于 2013-05-31T10:14:14.570 に答える