2009-05-19 12 views
4

は簡単です...が、その午前3時とイムは、おそらく明らかを見下ろします。シンプルなフォーラムをコーディングテーブルの最新レコードにどのように参加できますか?私が行って必要なもの

イム。 1つのテーブルにはフォーラムのタイトルや説明などが格納され、他のテーブルにはポストが格納されます。すべてのフォーラムのリストを示しフォーラムのリストでは、私は、各フォーラムの最新のポストをつかみ、そしてポストの件名、ポスター、ポストID、および日付を表示したいです。シンプル。

唯一の問題は、私はポストのテーブルに参加するとき、それはそのフォーラムの最後のポストを表しますテーブル内の最初のレコードではなく、最後に参加しています。ここで

は、フォーラム+(今「最初のポスト」として機能)「最新」のポストのためのデータのリストを取得する単純化されたクエリです。

SELECT forum_title, forum_id, post_subject, post_user, post_id, post_date FROM board_forums 
    LEFT JOIN board_posts 
    ON (forum_id = post_parentforum AND post_parentpost = 0) 
WHERE forum_status = 1 
GROUP BY forum_id 
ORDER BY forum_position 

どうすればこの問題を解決できますか?

答えて

5

あなたが打っている問題は、古典的です。あいまいなGROUP BYの問題です。他のRDBMS(および標準SQL)ではクエリがまったく許可されないため、これはMySQLに特有です。 GROUP BYに集計されていない列をすべて一覧表示していないため、クエリが単一値規則に失敗しました。

は、ここでグループごとに最大の行を取得する私の好みの方法を実証するソリューションです:

SELECT f.forum_title, f.forum_id, p1.post_subject, p1.post_user, 
    p1.post_id, p1.post_date 
FROM board_forums f 
LEFT JOIN board_posts p1 
    ON (f.forum_id = p1.post_parentforum AND p1.post_parentpost = 0) 
LEFT JOIN board_posts p2 
    ON (f.forum_id = p2.post_parentforum AND p2.post_parentpost = 0 
     AND p1.post_id < p2.post_id) 
WHERE p2.post_id IS NULL AND f.forum_status = 1 
ORDER BY f.forum_position; 

p2.post_id IS NULL場合、それは何のポストはp1で見つかったポストよりも大きいp2に見つからないことを意味します。

Ergo、p1は最新の投稿です(post_idは自動インクリメント)。


再コメント:これで

若干の問題。最高のIDを持つpost_idは必ずしも最新の投稿とは限りません。

問題ありません。前の投稿と後の投稿を区別することが保証されている列を使用してください。あなたはpost_dateと言います。ネクタイの場合は、別の列(または列)との関係を時系列順にする必要があります。

LEFT JOIN board_posts p2 
    ON (f.forum_id = p2.post_parentforum AND p2.post_parentpost = 0 
    AND (p1.post_date < p2.post_date 
     OR p1.post_date = p2.post_date AND p1.post_millisecond < p2.post_millisecond)) 
+1

私はあなたが問題を言及してくれてうれしい - 私は戻って、この質問に半ダース回来たが、それはそこに書かれていたとしても、クエリが働いていた方法を見つけ出すことができなかったので、あきらめました。 MySQLユーザではなく、GROUP BYを修正せずにスライドさせることはできませんでした。今私は知っている! :) – TML

+0

うん。 MySQLは、あなたが何をやっているのかを知っていること、そして単一価値ルールに従っていることを信頼しています。 SQLiteも同じ動作をします。あいまいな列(グループごとに複数の値)を持つクエリを記述すると、RDBMSは任意の値を選択します。 MySQLは「最初の」行の値を(行の物理的な格納順に)選択します。偶然、SQLiteは "最後の"行から値を選択します。 –

+0

これに少し問題があります。最高のIDを持つpost_idは必ずしも最新の投稿とは限りません。新しいスレッドが作成された場合、最新のIDを持ちます。この場合、あなたのサンプルが動作します。しかし、一度、より古いスレッド(より低いIDを持つ)で応答が行われると、それはもはやそのように機能しなくなり、最も高いIDを持つtheradを示します。 post_dateに基づいて表示する必要があります。 –

関連する問題