簡體   English   中英

SQL如何為每個字段計數表

[英]SQL How to Count table for each fields

我有3張桌子,它們是:

課程

  • courses_id
  • 名稱

QnAs

  • qna_id
  • 學生卡
  • courses_id
  • 名稱

學生們

  • 學生卡
  • 名稱

現在,我試圖計算每個課程有多少個qna。 如何進行查詢?

我嘗試這樣做:

SELECT (SELECT COUNT(qna_id) AS Expr1
              FROM    QnAs) AS Count
FROM   QnAs AS QnAs_1 CROSS JOIN
             Courses
GROUP BY Courses.courses_id

它確實會計算有多少QnA,但不是每個課程

我得到的輸出是每個課程的名稱和QnA計數編號,但是我想要的是每個課程的QnA編號

為什么不只使用GROUP BY

SELECT q.courses_id, COUNT(qna_id) as cnt
FROM QnAs q
GROUP BY q.courses_id;

看來您只想按課程ID匯總QNA:

select courses_id, count(*)
from qnas
group by courses_id
order by courses_id;

連同課程名稱:

select c.course_id, c.name, coalesce(q.cnt, 0) as qna_count
from courses c
left join
(
  select courses_id, count(*) as cnt
  from qnas
  group by courses_id
) q on q.course_id = c.course_id
order by c.course_id;

這不是答案,而只是解釋查詢的作用。

在您自己的查詢中,您首先將所有QnA與所有課程交叉交叉(沒有明顯的原因),從而獲得了所有可能的組合。 因此,如果有兩門課程,每門課程都有三個QNA(總共六個QNA),則您將構造2 x 6 = 12行。

對於這些行中的每一行,請選擇QNA表中的總行數,在上面的示例中為6。 因此,您將選擇12行,全部顯示數字6。

但是,然后您按課程ID進行分組,因此在我的示例中僅以兩行結尾。 您應該在子查詢上應用聚合函數,例如MAXSUM ,但不要這樣做,這會使查詢無效(因為您要處理的行很多,但應將其視為單個值)。 但是,MySQL默默地應用ANY_VALUE ,因此您的查詢變為:

SELECT
  ANY_VALUE( (SELECT COUNT(*) FROM QnAs) ) AS Count
FROM QnAs AS QnAs_1 
CROSS JOIN Courses
GROUP BY Courses.courses_id;

我希望這種解釋可以幫助您了解聯接和聚合的工作方式。 您可能希望設置ONLY_FULL_GROUP_BY模式( https://dev.mysql.com/doc / ... ),以便讓MySQL報告語法錯誤,而不是通過應用ANY_VALUE靜默“修復”查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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