我有3张桌子,
现在,我正在尝试计算每个课程有多少个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编号
答案 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分组,因此仅在我的示例中以两行结尾。您应该在子查询上应用汇总函数,例如MAX
或SUM
,但不是这样,这会使查询无效(因为您要处理许多行,但应将其视为单个值)。但是,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
来“固定”查询。