0

私は自分のウェブサイトのフォーラム ティーザーを作成するのが好きです。最新の投稿またはスレッドを表示するのは簡単です..最新のスレッドと投稿を同じクエリで取得し、最後のアクティビティ順に並べるのが好きです。したがって、同じクエリで REPLY TO POST の日付と THREAD POST の日付で並べ替えられます。グループ化の方法に関係があると思いますが、よくわかりません。

テーブル

スレッド

id, header, text, date, author

投稿

id, text, date, author, thread_id

使用例

20 分前 - php/mysql スクリプトの作成方法 (2)

17 分前 - ここで助けてください (0)

1 時間前 - PHP のヘルプが必要です (1)

ご覧のとおり、回答済みのスレッドと新しいスレッドの両方がリストに表示されています。(最新の返信の日付または作成日、ヘッダー、および返信の count() が必要です)

これを行う方法を理解していただければ幸いです。

トロールズ

アップデート:

私はこれを持っていて大丈夫ですが、返信のあるスレッドしか取得しません。

SELECT 
    threads.*, 
    posts.*, 
    (SELECT date FROM posts WHERE thread_id = threads.id ORDER BY date DESC LIMIT 0,1) AS postdate, 
    (SELECT count(id) FROM threads WHERE thread_id = thread.id) AS replys 
FROM 
    threads, 
    posts 
WHERE 
    threads.id = posts.thread_id
GROUP BY 
    thread_id
ORDER BY 
    postdate DESC, 
    thread.date 
LIMIT 
    0,15

これどうやってするの?

アップデート

あああああああああああああああああああああああああ!!!

私はなんとか自分でそれを行うことができました:-)それを正しくするのにしばらく時間がかかりました.

SELECT 
    fisk_debat.id, 
    fisk_debat.dato,
    IF((SELECT count(id) FROM fisk_debat_svar WHERE debatid = fisk_debat.id) < 1, fisk_debat.dato, (SELECT dato FROM fisk_debat_svar WHERE debatid = fisk_debat.id ORDER BY dato DESC LIMIT 0,1)) AS svardato,
    fisk_debat.overskrift,
    (
    SELECT count(fisk_debat_svar.debatid) 
    FROM fisk_debat_svar 
    WHERE fisk_debat_svar.debatid = fisk_debat.id
    ) AS svar

FROM  fisk_debat
GROUP BY  id
UNION
SELECT
    fisk_debat_svar.debatid AS id, 
    max(fisk_debat_svar.dato) AS dato,
    max(fisk_debat_svar.dato) AS svardato,
    (
    SELECT fisk_debat.overskrift 
    FROM fisk_debat 
    WHERE fisk_debat.id = fisk_debat_svar.debatid
    ) AS overskrift,
    (
    SELECT count(fisk_debat_svar.debatid) 
    FROM fisk_debat_svar 
    WHERE fisk_debat_svar.debatid = id
    ) AS svar

FROM fisk_debat_svar
WHERE id != id
GROUP BY id

ORDER BY svardato DESC, dato DESC
LIMIT 0,15
4

2 に答える 2

0

現在の DB 構造を維持したい場合は、目的の結果を得るために Union が必要です。例はhttp://www.mysqltutorial.org/sql-union-mysql.aspxにあります。

ただし、質問へのコメントで説明されているように、構造を変更することをお勧めします。

于 2011-05-16T12:26:47.467 に答える
0

WHERE句は、返信のあるスレッドのみを選択しますが、これは正常です。LEFT JOIN構文を使用する必要があります。

これを試して:

SELECT 
    threads.*, 
    posts.*, 
    (SELECT date FROM posts WHERE thread_id = threads.id ORDER BY date DESC LIMIT 0,1) AS postdate, 
    (SELECT count(id) FROM threads WHERE thread_id = thread.id) AS replys 
FROM 
    threads
LEFT JOIN
    posts
ON
    threads.id = posts.thread_id
ORDER BY 
    postdate DESC, 
    thread.date 
LIMIT 
    0,15
于 2011-05-16T12:29:06.090 に答える