2

PHPとMySQLを使用してカスタムフォーラムを作成しました。2つのテーブルがあります。1つはスレッド用で、もう1つはスレッド内のメッセージ用です。

管理者がベストアンサーとしてメッセージを選択できる機能を実装しています。メッセージテーブルには、best_answerのBOOL列があります。

スレッドを一覧表示するページで、スレッドにベストアンサーが選択されているかどうかを示したいと思います。

すべてのスレッドを選択するだけでなく、スレッドのメッセージを調べて、ベストアンサーが選択されているかどうかを確認するクエリを作成することは可能ですか?

私は次のようなことを試みていました:

SELECT *
FROM `threads`
JOIN `messages` ON `threads`.`id` = `messages`.`thread_id`
WHERE `messages`.`best_answer` = 1

ただし、これはベストアンサーのスレッドのみをプルするため、すべてのスレッドをプルして列を作成する必要があるため、ベストアンサーがあるかどうかを確認できます。

スレッドテーブルに列を追加して、ベストアンサーが選択されているかどうかをマークする方がよいでしょうか。

4

4 に答える 4

4

純粋なSQLソリューションを探しているなら、これでうまくいくはずです。

select * 
from threads
join (
    select threads.id, 
    sum(messages.best_answer) as has_best_answer
    from threads join messages
    on threads.id = messages.thread_id
    group by threads.id
)temp
on threads.id = temp.id

編集:クエリをに短縮しました

select * 
from threads
join (
    select thread_id, 
    sum(messages.best_answer) as has_best_answer
    from messages
    group by thread_id
)temp
on threads.id = temp.thread_id
于 2013-02-20T18:28:01.847 に答える
4

select場合によっては、句でサブクエリを使用することで、結果を「確認」する方が簡単です。

select t.*,
       (select MAX(bestanswer) from messages m where m.thread_id = t.id
       ) as HasBestAnswer
from threads t

ただし、これにより結果がスレッドのみに制限されますが、これは希望どおりのようです。

于 2013-02-20T18:32:55.323 に答える
1
SELECT *
FROM `threads`
LEFT JOIN `messages` ON `threads`.`id` = `messages`.`thread_id` AND `messages`.`best_answer` = 1
GROUP BY `threads`.`id`

これにより、すべてのスレッドと、可能であれば最良の回答が得られます。 LEFT JOINは、ベストアンサーが見つからないスレッドを表示するためにも使用されONます。trueまたはfalseに評価される句内のすべての式を使用できます。

GROUP BY、結果セット内で特定のエントリを1つだけ提供するために使用されthread_idます。したがって、ベストアンサーは1つだけです。

ただし、「ベストアンサー」セクションをmessagesテーブルからテーブルに移動する必要がありthreadsます。1つのスレッドが持つことができるベストアンサーは1つだけであり、その逆はできません。

于 2013-02-20T18:27:30.327 に答える
0

これにより、次のようにデータがプルされます。

SELECT threads.*, messages.best_answer
FROM threads
LEFT JOIN messages ON threads.id = messages.thread_id
GROUP BY threads.id
ORDER BY messages.best_answer DESC

そして後で、結果セットで...

while ( $row = [...] ){
    if ( $row['best_answer'] > 0 ) { 
        // Best Answer is set, do something
    } else {
        // No best answer, do something else
    }
}

結果を、列が1に設定されているものだけに制限していた句は含まれていません。これですべてが取得され、WHEREaが1か0かをループでチェックできます。threadsmessagebest_answerthreadsbest_answer

于 2013-02-20T18:22:01.923 に答える