2

別のテーブルの返信数に関するフォーラムトピックの並べ替えを取得するこのクエリで問題が発生しています。whereの前にLeftjoinを使用してこれを試しましたが、whileループで一部のデータが省略されていました。

SELECT forum_topics.*, COUNT(forum_posts.comment_id) AS replies 
FROM forum_topics 
WHERE forum_topics.subcat_id = '$subcatid' 
LEFT JOIN forum_posts 
ON forum_topics.topic_id=forum_posts.topic_num  
ORDER BY replies DESC

それは私にこれをエラーとして与えます:

You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near 'LEFT JOIN forum_posts ON 
forum_topics.topic_id=forum_posts.topic_num ORDER BY r' at line 1

これは、以前は機能していたクエリです。

SELECT * FROM forum_topics WHERE subcat_id = '$subcatid' ORDER BY date DESC

エコーするには、次を使用します。

$getChildCategory = mysql_query($query) or die(mysql_error());
$num = mysql_num_rows($get); 
if($num == 0){ echo 'No Posts';}
else{
    while ($row = mysql_fetch_assoc($get)){

エコーすると、左の結合で1つの結果しか得られませんが、古い結合では2つの結果が得られました。これは私が期待したものです。

4

1 に答える 1

7

これは、句の順序が間違っているためです。

これは正しい構文です(以下のコメントごとに編集):

SELECT `forum_topics`.*, COUNT(`forum_posts`.`comment_id`) AS `replies`
FROM `forum_topics`
LEFT JOIN `forum_posts` 
ON `forum_topics`.`topic_id` = `forum_posts`.`topic_num`
WHERE `forum_topics`.`subcat_id` = '$subcatid'
GROUP BY `forum_posts`.`topic_num`
ORDER BY `replies` DESC

何らかの種類のを実行するとJOIN、関連するすべてのテーブルを統合した一種の「仮想テーブル」が作成されます。WHEREwhere句はこの「仮想テーブル」で動作するため、考えてみると、このテーブルが作成された後にのみ句を使用するのが理にかなっています。

于 2012-08-01T16:14:33.637 に答える