如何在下面的示例中正确执行SQL中的计数

时间:2013-01-19 00:17:23

标签: mysql sql database join

我在下面有一个数据库示例:

会话表:

SessionId (PK auto)  SessionName
1                    SODJW

问题表:

QuestionId (PK auto)  QuestionContent  SessionId (FK) refer to Session
1                     Blah             1   
2                     Blah Blah        1
3                     Blah Blah Blah   1

Penalty_Marks表:

PenaltyAnswerId  PenaltyMarks  QuestionId (FK) refer to Question
1                1             1
2                0             1
3                1             2
4                2             3
5                2             3

现在我想执行一个SQL,它会计算会话的PenaltyMarks。为此,我们需要知道哪个QuestionId属于SessionId,然后计算标记。

我的问题是如何编写SQL以便能够在QuestionId内找到SessionId,以便我们可以计算罚分数?原因我问这是因为它给了我不正确的计数值。

我的尝试:

SELECT COUNT(PenaltyMarks)
FROM Session s
INNER JOIN Question q ON s.SessionId = q.SessionId
INNER JOIN Penalty_Marks pm ON q.QuestionId = pm.QuestionId
WHERE s.SessionId = 1; 

3 个答案:

答案 0 :(得分:3)

您的查询返回行数,而不是惩罚总计数。另外你说你需要用总惩罚标记查看每个会话的问题,所以你必须按会话ID和问题ID进行分组。

SELECT s.SessionId,q.QuestionId,SUM(pm.PenaltyMarks)
    FROM Session s
    INNER JOIN Question q ON s.SessionId = q.SessionId
    INNER JOIN Penalty_Marks pm ON q.QuestionId = pm.QuestionId
    GROUP BY s.SessionId,q.QuestionId

SQL Fiddle Demo

答案 1 :(得分:1)

我认为您需要SUM(PenaltyMarks)而不是COUNT(PentaltyMarks)您可能还需要GROUP BY QuestionId

我现在无法测试它。

答案 2 :(得分:1)

Count返回行数;您想使用sum(),它会为您添加行中的值。