2011-06-24 5 views
0

私のフォーラムを少しアップグレードして、トピックの表示方法を変更したい。トピックへデータベース(JOIN?)の結果をソートする際のヘルプ

CREATE TABLE `forum_emner` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `type_forum` CHAR(9) NOT NULL, 
    `gjengid` INT(10) UNSIGNED NULL DEFAULT '0', 
    `sticky` TINYINT(1) UNSIGNED NULL DEFAULT '0', 
    `emne` VARCHAR(255) NOT NULL, 
    `innlegg` TEXT NOT NULL, 
    `brukerid_starter` MEDIUMINT(8) UNSIGNED NOT NULL, 
    `startet_dato` INT(10) UNSIGNED NOT NULL, 
    `antall_lest` INT(10) UNSIGNED NULL DEFAULT '0', 
    `antall_svar` INT(10) UNSIGNED NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    INDEX `type_forum` (`type_forum`), 
    INDEX `gjengid` (`gjengid`), 
    INDEX `sticky` (`sticky`), 
    INDEX `brukerid_starter` (`brukerid_starter`) 
) 
COLLATE='latin1_swedish_ci' 
ENGINE=MyISAM 
ROW_FORMAT=DEFAULT 

回答(emneidがforum_emnerテーブルのIDに等しい)、このテーブルに格納されています:

私のトピックは、このテーブルに格納された答えだったとき

CREATE TABLE `forum_svar` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `emneid` INT(10) UNSIGNED NOT NULL, 
    `brukerid_av` MEDIUMINT(8) UNSIGNED NOT NULL, 
    `innlegg` TEXT NOT NULL, 
    `dato` INT(10) UNSIGNED NOT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `emneid` (`emneid`), 
    INDEX `brukerid_av` (`brukerid_av`) 
) 
COLLATE='latin1_swedish_ci' 
ENGINE=MyISAM 
ROW_FORMAT=DEFAULT 

ダトですposted(phpでtime())。

私が望むもの:forum_svarのフィールドの後ろにあるトピックを並べ替える必要があります。最新の回答を持つトピックがトップにあります。しかし、トップトピックの後にトピックが作成された場合は、このトピックがトップになるはずです(フォーラムの実際の仕組み)。

私は自分自身を試しましたが、うまく動作しません。

SELECT *, `forum_emner`.id AS UnikTradID FROM `forum_emner` 
LEFT JOIN `forum_svar` ON (`forum_emner`.id = `forum_svar`.emneid) 
WHERE `forum_emner`.type_forum = :type AND `forum_emner`.sticky = 0 
ORDER BY `forum_svar`.dato DESC LIMIT :p1, :p2 

ヘルプがありますか? :)

+0

私はあなたがmysqlデータベースの数値としてタイムスタンプを保存しないことをお勧めします。代わりに[mysql timestamp](http://dev.mysql.com/doc/refman/5.0/en/timestamp.html)を使用してください。 – cypher

答えて

0

私は下のようにクエリをより読みやすくするためにASを使用してください。 そして、MySQLのフィールド名を英語以外のものにしてはいけません。あなたの言語を話さない人を雇うならどうしますか? :)

最初に行うべきことは、最新のスレッドIDを取得することです。 私たちは、このようなクエリであることを行うことができます。

SELECT MAX(fs.id) AS LastThreadId FROM forum_svar AS fs GROUP BY fs.emneid ORDER BY LastThreadId 

を今、私たちは完全なスレッド情報を取得するためにスレッドを設定し、この結果に参加する必要があります。 だから我々はここにサブクエリとして最初のクエリを置くことによって、このようにそれを実行します。

SELECT fs.* FROM forum_svar AS fs LEFT JOIN (SELECT MAX(fs.id) AS LastThreadId FROM forum_svar AS fs GROUP BY fs.emneid ORDER BY LastThreadId DESC) n ON (n.LastThreadId = fs.id) WHERE n.LastThreadId IS NOT NULL 

これは今あなたに、最新のスレッドを取得します。楽しい! :)
P.S.それがうまくいけば答えを受け入れることを忘れないでください!

+0

いいえ、それはありません。 トピックに回答がある場合、それは何度も印刷されます(トピックに1つの回答がある場合は、トピックのリストにトピックを2回、回答があるトピックは一度印刷しますが、下部に表示します)。 – Thomas

+0

今はどうですか?私はここにあるクエリを試して、私はそれを編集しました。ああ、 '*'を使用する代わりに、すべてのフィールドを持つのではなく、返されるフィールドを正確に指定する必要があります。 – Rihards

+0

ありがとう!そのほとんどは今働いている。しかし、それは各トピックの最初の答えからトピックを並べ替えるだけです。トピックの最後の答えの後には短くする必要があります。あなたはそれを助けることができますか? :) – Thomas