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標準および他のほとんどのデータベースによることを意味します)。

クエリの問題は、groupbyが欠落していることです。これを記述する別の方法は、カテゴリに参加するに、サブクエリで集計することです。

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 に答える