[英]Join query to count the number of records isn't counting right
我有一個類別表,有點像StackOverflow上的標簽。 有類似JavaScript的類別,它們可能是頂級類別,也許jQuery可能是JavaScript的子類別。
我想要查詢的是每個類別下有多少記錄(在我的應用程序中它們是“問題”)。
這是我到目前為止的SQL。 problem_categories只是一個具有problem_id和category_id的連接表。
select problems.problem_id , categories.category_id , category_name , count(problems.problem_id) as num_problems , is_top
from problems
left join problem_categories on
problems.problem_id = problem_categories.category_id
left join categories on
problem_categories.category_id = categories.category_id
where is_top = 1;
這只返回一行。 我希望的是返回is_top = 1的記錄數(這意味着它是一個頂級類別)。
我怎么能改變我的查詢呢?
謝謝!!
沒有猜測邏輯,錯誤的是你需要GROUP BY
來計算:
SELECT problems.problem_id, categories.category_id, category_name,
COUNT(problems.problem_id) as num_problems, is_top
FROM problems
LEFT JOIN problem_categories
ON problems.problem_id = problem_categories.category_id
LEFT JOIN categories
ON problem_categories.category_id = categories.category_id
WHERE is_top = 1;
GROUP BY problems.problem_id, categories.category_id, category_name
但是如果你想要每個頂級類別的問題數量,你的邏輯可能會這樣:
SELECT category_name, categories.category_id, problems.problem_id,
COUNT(problems.problem_id) as num_problems
FROM categories
JOIN problem_categories
ON problem_categories.category_id = categories.category_id
JOIN problems
ON problems.problem_id = problem_categories.category_id
WHERE is_top = 1;
GROUP BY category_name, categories.category_id, problems.problem_id
請注意:
“這只返回一行。我希望的是返回is_top = 1的記錄數(這意味着它是一個頂級類別)。” 我懷疑這就是你得到的。
...count(problems.problem_id) as num_problems...
...where is_top = 1;
我認為您需要在一個或多個字段上引入GROUP BY
子句
您的查詢中有一些不妥之處:
如其他答案中所述,查詢缺少GROUP BY子句
查詢中的第一個JOIN是匹配不相關的列 - “on problems.problem_id = problem_categories.category_id”。 如您所見,它正在使用category_id加入problem_id
categories
表保持在LEFT JOIN的最左側更有意義。 problems
表,因為輸出中不需要該表中的任何內容 請在您的查詢的另一個版本下面:
SELECT `categories`.`category_id`, `categories`.`category_name`, COUNT(`problem_categories`.`problem_id`) AS `num_problems`, `categories`.`is_top`
FROM `categories`
LEFT JOIN `problem_categories` ON `problem_categories`.`category_id` = `categories`.`category_id`
WHERE `categories`.`is_top` = 1
GROUP BY `categories`.`category_id`;
希望以上有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.