0

私はある種のメッセージボードで作業していて、1 つの小さな部分を除いてすべて実行中です。スレッドは、最新の投稿の日付/時刻 (標準フォーラム形式) でソートする必要があり、多くの問題を抱えています。頭を包み込む。

これは私が使用しているクエリです。きれいではなく、安全ではないことはわかっています。適切に行う方法を学んだら、それらを作り直します。

$sql = "SELECT Thread_ID, Thread_Title, Board_ID, Author FROM threads WHERE Board_ID='$Board_ID' LIMIT $offset, $rowsperpage";
$result = mysql_query($sql, $conn) or trigger_error("SQL", E_USER_ERROR);

while ($row = mysql_fetch_assoc($result))
{

$Thread_ID = $row['Thread_ID']; 
$Thread_Title = $row['Thread_Title'];   
$Board_ID = $row['Board_ID'];       
$Author = $row['Author']; 

$getauthor = mysql_query("SELECT * FROM members WHERE Member_ID='$Author'");
while ($row = mysql_fetch_assoc($getauthor))
{
$Post_Author = $row['Post_As']; }


$postcount = mysql_query("SELECT Post_ID FROM posts WHERE Thread_ID='$Thread_ID'");                 
$Posts = mysql_num_rows($postcount);

$getlatest = mysql_query("SELECT * FROM posts WHERE Thread_ID='$Thread_ID' ORDER by Post_DateTime DESC LIMIT 1");
while ($row = mysql_fetch_assoc($getlatest))
{
$Post_DateTime = time_ago($row['Post_DateTime']);
$Member_ID = $row['Member_ID']; }

$getmember = mysql_query("SELECT * FROM members WHERE Member_ID='$Member_ID'");
while ($row = mysql_fetch_assoc($getmember))
{
$Post_As = $row['Post_As']; }   

だから、私がやろうとしているのは $getlatest で $sql をソートすることです。基本的に $getlatest と同じように $sql の上に別のクエリを追加しようとしました。

$sql を並べ替えるには変数を作成する必要があることはわかっていますが、その変数は私を怒らせます。

助けていただければ幸いです、ありがとう。

要求された現在のエラー メッセージ:

致命的なエラー: SQL - 'on 句' の不明な列 'posts2.LatestPost' - SELECT スレッド.Thread_ID、threads.Thread_Title、threads.Board_ID、threads.Author、Sub1.LatestPost、Sub1.PostCount、members.Post_As、members2.Member_ID AS LastPostMemberID, members2.Post_As AS LastPostMemberPostAs FROM スレッド INNER JOIN (SELECT Thread_ID, MAX(posts.Post_DateTime) AS LatestPost, COUNT(*) AS PostCount FROM 投稿 GROUP BY Thread_ID) Sub1 ON threads.Thread_ID = Sub1.Thread_ID INNER JOIN members ONスレッド.Author = members.Member_ID INNER JOIN は posts2 に posts2 を投稿します。 0, 25 in C:\wamp\www\forum\include\threads.php 行 86

4

1 に答える 1

0

最初のクエリに次のようなものを使用してそれを行うことができるはずです:-

$sql = "SELECT threads.Thread_ID, threads.Thread_Title, threads.Board_ID, threads.Author, MAX(posts.Post_DateTime) AS LatestPost
        FROM threads 
        LEFT OUTER JOIN posts ON threads.Thread_ID = posts.Thread_ID
        WHERE threads.Board_ID='$Board_ID' 
        GROUP BY SELECT threads.Thread_ID, threads.Thread_Title, threads.Board_ID, threads.Author
        ORDER BY LatestPost DESC
        LIMIT $offset, $rowsperpage";

編集

以下はテストされていませんが、あなたの選択を見ると、おそらく単一のSELECTにまとめることができると思います。このようなもの:-

$sql = "SELECT threads.Thread_ID, threads.Thread_Title, threads.Board_ID, threads.Author, Sub1.LatestPost, Sub1.PostCount, members.Post_As, members2.Member_ID AS LastPostMemberID, members2.Post_As AS LastPostMemberPostAs
        FROM threads 
        INNER JOIN (SELECT Thread_ID, MAX(posts.Post_DateTime) AS LatestPost, COUNT(*) AS PostCount FROM posts GROUP BY Thread_ID) Sub1
        ON threads.Thread_ID = Sub1.Thread_ID
        INNER JOIN members 
        ON threads.Author = members.Member_ID
        INNER JOIN posts posts2
        ON posts2.Thread_ID = Sub1.Thread_ID AND posts2.Post_DateTime = Sub1.LatestPost
        INNER JOIN members members2
        ON members2.Member_ID = posts2.Member_ID
        WHERE threads.Board_ID='$Board_ID' 
        ORDER BY Sub1.LatestPost DESC
        LIMIT $offset, $rowsperpage";
$result = mysql_query($sql, $conn) or trigger_error("SQL", E_USER_ERROR);

while ($row = mysql_fetch_assoc($result))
{

    $Thread_ID = $row['Thread_ID']; 
    $Thread_Title = $row['Thread_Title'];   
    $Board_ID = $row['Board_ID'];       
    $Author = $row['Author']; 
    $Post_Author = $row['Post_As']; 
    $Posts = $row['PostCount']; 
    $Post_DateTime = time_ago($row['LatestPost']);
    $Member_ID = $row['LastPostMemberID']; 
    $Post_As = $row['LastPostMemberPostAs']; 
于 2013-07-07T20:41:09.437 に答える