0

我有一张桌子categories和一张桌子posts。我想返回超过 3 个帖子的类别。

我的查询

SELECT `categories`.`category_title`, COUNT(posts.post_id) as total_posts 
FROM (`categories`) 
JOIN `posts` ON `posts`.`category_id` = `categories`.`category_id` 
HAVING `total_posts` > 3 
ORDER BY `categories`.`date_created` desc

它只返回 1 行。在不使用 2 个查询的情况下执行此类查询的正确方法是什么?

4

2 回答 2

3

您的查询正在使用称为“隐藏列”的 MySQL 功能,您甚至可能不知道。这是因为您的查询引用了诸如 date_created 之类的元素,这些元素应该被聚合但不是(这里的“应该”是指根据 SQL 标准和大多数其他数据库)。

您的查询的问题是它缺少分组依据。另一种编写方式是在加入类别之前使用子查询中的聚合:

SELECT `categories`.`category_title`, total_posts 
FROM `categories` JOIN
     (select categoryid, COUNT(posts.post_id) as total_posts
      from `posts`
      group by categoryid
      having count(*) > 3
     ) pc
     ON `pc`.`category_id` = `categories`.`category_id`
ORDER BY `categories`.`date_created` desc
于 2012-08-19T20:47:36.613 回答
2

您需要group按类别分类项目。

SELECT `categories`.`category_title`, COUNT(posts.post_id) as total_posts 
FROM (`categories`) 
JOIN `posts` ON `posts`.`category_id` = `categories`.`category_id` 

GROUP BY `categories`.`category_id`

HAVING `total_posts` > 3 
ORDER BY `categories`.`date_created` desc
于 2012-08-19T20:42:00.797 回答