簡體   English   中英

加入查詢來計算記錄數不正確

[英]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

請注意:

  • 對於每個類別,您都會遇到問題,而您會計算出這些問題
  • 你使用JOIN而不是LEFT JOIN,因為你不關心那些沒有問題的類別。
  • 您可以將is_top保留在select之外,因為無論如何都將它放在WHERE子句中。 選擇不在GROUP BY中的內容將獲得任意隨機值,但由於所有值均為1,您可以安全地執行此操作,或者只是保留它。

“這只返回一行。我希望的是返回is_top = 1的記錄數(這意味着它是一個頂級類別)。” 我懷疑這就是你得到的。

...count(problems.problem_id) as num_problems...
...where is_top = 1;

我認為您需要在一個或多個字段上引入GROUP BY子句

您的查詢中有一些不妥之處:

  1. 如其他答案中所述,查詢缺少GROUP BY子句

  2. 查詢中的第一個JOIN是匹配不相關的列 - “on problems.problem_id = problem_categories.category_id”。 如您所見,它正在使用category_id加入problem_id

  3. 雖然這可能不是當前數據集的問題,但是為了獲得每個類別的計數,將categories表保持在LEFT JOIN的最左側更有意義。
  4. 從優化的角度來看,我認為您不需要在查詢中放置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM