我在使用此查询时遇到问题,该查询会根据不同表中的回复数量对论坛主题进行排序。我在之前使用左连接尝试了这个,但是在我的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,这是我的预期。
答案 0 :(得分:6)
那是因为条款的顺序错误。
这是正确的语法(以下评论已编辑):
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
时,您会创建一种“虚拟表”,它是所有相关表的合并。 where子句在这个“虚拟表”上运行,所以如果你考虑一下,只有在创建了这个表之后才能使用WHERE
子句。