【发布时间】:2018-06-05 15:50:19
【问题描述】:
我正在尝试根据某些条件对字段进行计数。但是我还不能达到预期的效果。
表格 :: 测验问题:
qq_id | qq_type | qq_title
----------------------------------------------------
1 | 1 | This is a multiple choice question
2 | 2 | This is a single choice question
3 | 4 | This is a descriptive type question
表格 :: 测验问题详情:
qqd_id | qqd_question_id | qqd_option_text | qqd_option_is_answer
-----------------------------------------------------------------
1 | 1 | Yes | 1
2 | 1 | No | 2
3 | 1 | May Be | 1
4 | 2 | Yes | 1
5 | 2 | No | 2
表格 :: 测验参与者答案:
qa_id | qa_quiz_id| qa_participant_id | qa_question_id | qa_answer**
-------------------------------------------------------------------------------
1 | 1 | 3 | 1 | 1
2 | 1 | 3 | 1 | 3
3 | 1 | 3 | 2 | 4
4 | 1 | 3 | 3 | null
** qa_answer 字段是测验问题详情表的 qqd_id。
问题(qq_id = 1)是一个选择题,因此会有多个答案。 问题(qq_id = 2)将只有一个答案,问题(qq_id = 3)将是一个描述性问题。
admin定义的答案存储在问题详情表中,我们可以看到qqd_question_id = 1有3个答案,其中2个是正确的(qqd_id 1 & 3)
计算正确答案计数和总回答计数,我得到的总正确答案计数为 3(这是错误的,预期为 2,因为问题 id(qq_id = 1 是一个问题,但有多个答案) ) 和总回答数为 3(这是正确的)。
我正在使用 laravel 5.4 框架。我正在使用以下查询测试查询。
注意:出于测试目的,我在表中添加了附加字段(qa_is_correct_answer)(没有与详细信息表连接),请忽略。
DB::table('quiz_answers AS QA')
->select(DB::Raw('QA.*, SUM(QA.qa_is_correct_answer = 1) AS correct, COUNT(DISTINCT QA.qa_question_id) AS total_answered'))
->where('QA.qa_quiz_id',$quizID)
->where('QA.qa_participant_id',$participantID)
->groupBy('QA.qa_quiz_id')
->get();
SQL 小提琴: http://sqlfiddle.com/#!9/ba1650/3
【问题讨论】:
-
我不完全关注你的数据,但我会告诉你,在 group by 时选择
QA.*是无效的。 -
我看不到想要的结果。见meta.stackoverflow.com/questions/333952/…
-
@Strawberry 我用 SQL 小提琴的链接更新了问题
-
@TimBiegeleisen MySQL 允许这样做。如果您启用了 ONLY_FULL_GROUP_BY 事件,只要所有其他列都由分组列唯一确定,它就会起作用,如果您按主键分组,这将是真的。
-
@Barmar 仅仅因为它运行并不意味着结果集是正确的,假设其中一些列在功能上不依赖于逐列分组,我们也不应该鼓励这样的查询堆栈溢出。