SQL如何为每个字段计数表

时间:2019-01-22 11:46:31

标签: mysql sql

我有3张桌子,

课程

  • courses_id
  • 名称

QnAs

  • qna_id
  • student_id
  • courses_id
  • 名称
  • 问题

学生

  • student_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编号

3 个答案:

答案 0 :(得分:0)

为什么不只使用GROUP BY

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

答案 1 :(得分:0)

似乎您只想按课程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;

答案 2 :(得分:0)

这不是答案,而只是解释查询的作用。

在您自己的查询中,您首先将所有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来“固定”查询。