2011-12-22 33 views
0

フォーラムをコード化したいと思います。サブフォーラムの概要を作成して、HTMLテーブルのスレッドの最新投稿を表示する必要があります。複数のスレッドとその最新の投稿を1つのクエリを使ってデータベースから取得する

Iは、2つのMySQLテーブルを有する:

forum_threads:

のID INT(10)
forumidはint(10)
表題VARCHAR(80)
ACCESSLEVEL整数(2)
をロックされたenum( 'yes'、 'no')

forum_post:

ID int型(10)
スレッドIDはint(10)
ユーザーID int型(10)
投稿日時
編集した日時
メッセージテキスト

私のクエリは、次のようになります。

SELECT * FROM `forum_threads` LEFT JOIN `forum_post` 
ON (forum_post.threadid = forum_threads.id) 
WHERE forumid='$secfid' 
AND accesslevel<='$secuserlevel' 
ORDER BY forum_post.posted DESC 
LIMIT $qStart,$ppp 

ここで、$ secfidはサブフォーラムのIDです。

私の問題は、結果セットにはすべての投稿が含まれているということです。そのため、各スレッドは、投稿数と同じ回数だけ含まれています。 各スレッドは、その結果行に最新のポストが1回だけ存在する必要があります。

私は追加のサブクエリでそれを解決できましたが、もっと良い方法があるかどうか尋ねたいと思っていました。

また、私はstackoverflowの上でこのようなものが見つかりました:これは、すべての必要な情報を返すだけで、最新のポストとのスレッドから

SELECT * FROM `forum_post` fp 
JOIN `forum_threads` ft 
ON (fp.threadid = ft.id) WHERE forumid=1 
AND accesslevel<='100' 
AND NOT EXISTS (
    SELECT * FROM forum_post fp2 
    JOIN forum_threads ft2 
    ON fp2.threadid = ft2.id 
    WHERE ft.forumid = ft2.forumid 
    AND fp.posted < fp2.posted 
) LIMIT 0,20 

を。

答えて

1

私は、各スレッドから最新の投稿を取得した副選択で参加することでやります。

subselectは、各スレッドで最新の投稿日付を返します。これを使用してスレッドとデータを取得することができます:

SELECT 
    thread.title, 
    post.text 
FROM 
    forum_thread thread 

-- Get latest post from each thread 
JOIN (
    SELECT  
     MAX(post.posted) as posted, 
     post.threadid 
    FROM 
     forum_post post 

    JOIN 
     forum_thread thread 
    ON 
     post.threadid = thread.id 

    -- Limit the forum and security levels 
    WHERE 
     thread.forumid = '$secfid' 
     AND thread.accesslevel <= '$secuserlevel'  
    GROUP BY 
     post.threadid 

) latest_post 
ON 
    thread.id = latest_post.threadid 

-- Get post data for the latest post 
JOIN 
    forum_post post 
ON 
    latest_post.threadid = post.threadid 
    AND latest_post.posted = post.posted 

LIMIT 
    $qStart, $ppp; 
+0

ありがとう!これは私が望むものに非常に近いです。 #1054 - MAX()を使用しているときに、 'on clause'に未知の列 'latest_post.posted'があります。 – Kazuo

+0

Ups、エイリアスをMAX()関数に追加するのを忘れました。 subselectに 'MAX(post.posted)as posted'が追加されたので、今すぐOKでなければなりません。 – Pat

関連する問題