0

これが繰り返しである場合は申し訳ありませんが、私の質問はかなり具体的であるため、本当に私の質問に答えるものは何も見つかりません.

私は php と mysql を使用してフォーラムを作成していますが、これまでのところうまくいっていますが、最新の投稿の日付に基づいて各カテゴリのスレッドを並べ替えたいと考えています。

私のデータベース構造はこれです:

Table: threads
Fields: name, f_id, t_id

Table: posts
Fields: author, date, post, t_id, p_id

スレッドには、スレッドの名前、スレッドが属するフォーラムの f_id、およびそれ自体の自動インクリメント スレッド ID が含まれます。posts には、作成者、日付、投稿、それが含まれているスレッドの t_id、および自動インクリメントされた投稿 ID があります。このため、間に別のスレッドで投稿が行われた場合でも、2 番目の投稿は常に最初の投稿よりも高い ID になります。

私の問題は、特定のフォーラムのすべてのスレッドを表示したいときに発生します。私は現在このコードを使用しています:

$t_query = mysqli_query($link, "SELECT name, t_id FROM threads WHERE f_id = ".$f_id."");

echo "<table><tr><td>Name</td><td>Author</td><td>Date</td></tr>";
while($rowt = mysqli_fetch_array($t_query)) {
    $p_query = mysqli_query($link, "SELECT author, DATE_FORMAT(date, '%r on %c/%e/%Y') as date_f, p_id FROM posts WHERE t_id = ".$rowt['t_id']." LIMIT 1");
    echo "<tr><td><a href=\"../pages/post.php?t_id=",htmlentities($rowt['t_id']),"\">",htmlentities($rowt['name']),"</a></td>";
        while($rowp = mysqli_fetch_array($p_query)){
            echo "<td>",htmlentities($rowp['author']),"</td><td>",htmlentities($rowp['date_f']),"</td></tr>";
}
echo "</table>";

日付が投稿にあり、最初のループがスレッドから取得されるため、日付で注文できないことを除いて、それは問題なく機能します。私が達成する必要があるのは、t_id がスレッドの t_id と等しい投稿から最大の p_id の日付を取得する結合です。

少し混乱しているように思えますが、誰かが結合クエリとphpの微調整を手伝ってくれることを願っています。

ありがとう、シャーフ。

4

2 に答える 2

2

グループ化と最大順での結合が必要です。

SELECT t.name, t.t_id FROM threads t
INNER JOIN posts p ON p.t_id = t.t_id
WHERE t.f_id = ID
GROUP BY t.name, t.t_id
ORDER BY MAX(p.date)

このクエリは空のスレッドを検出しないため、すべてのスレッドに少なくとも1つの投稿があると仮定します。そのためには、外部結合を使用する必要があります。

于 2013-01-10T07:08:52.560 に答える
1

スレッドリストを最新の投稿の日付で並べ替えたいと思いますよね?投稿に2回参加します。1回目は最新の日付で、2回目は新しい投稿がないことを確認します。例えば...

SELECT t.name, t.t_id
FROM threads t
JOIN posts p1 ON (p1.t_id = t.t_id)
LEFT JOIN posts p2 ON (p2.t_id = t.t_id AND p2.p_id > p1.p_id)
WHERE p2.p_id IS NULL
ORDER BY p1.date;
于 2013-01-10T07:08:01.263 に答える