【问题标题】:How to get count of particular field using case in MySQL如何在 MySQL 中使用 case 获取特定字段的计数
【发布时间】: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 仅仅因为它运行并不意味着结果集是正确的,假设其中一些列在功能上不依赖于逐列分组,我们也不应该鼓励这样的查询堆栈溢出。

标签: mysql laravel count


【解决方案1】:

我不知道如何将它翻译成 Laravel,但为了避免将多项选择题的所有答案都计算为单独的正确答案,您需要将它们组合在一个子查询中。

SELECT qa.*, SUM(qa.correct = 1) AS correct, COUNT(*) AS total_answered
FROM (
    SELECT qa.*, MIN(qa_is_correct_answer) AS correct
    FROM quiz_answers AS qa
    GROUP BY qa_quiz_id, qa_question_id
) AS qa
GROUP BY qa.qa_quiz_id

DEMO

顺便说一句,使用1 表示正确而使用2 表示不正确是很奇怪的。对于二元期权,我们通常使用01,其中1为真值。

【讨论】:

  • 谢谢你,正是我想要的! .我知道将值 1 和 2 分别用于正确和不正确是很奇怪的;)。但是我需要用这种方式
猜你喜欢
  • 2023-01-07
  • 2019-05-11
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
相关资源
最近更新 更多