2

我在使用此查询时遇到问题,该查询根据不同表中的回复数对论坛主题进行排序。我在 where 之前尝试了 Left join ,但在我的 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,您将创建一种“虚拟表”,它是所有相关表的合并。where 子句在此“虚拟表”上运行,因此如果您考虑一下,只有WHERE在创建此表之后该子句才有意义。

于 2012-08-01T16:14:33.637 回答