【问题标题】:MySQL COUNT IF with GROUP BY [duplicate]MySQL COUNT IF 与 GROUP BY [重复]
【发布时间】:2019-08-23 00:02:56
【问题描述】:

我正在尝试解决这个 LeetCode 问题 (https://leetcode.com/problems/get-highest-answer-rate-question/):

我已经在本地生成了survey_log:

mysql> select * from survey_log;
+------+--------+-------------+-----------+-------+-----------+
| uid  | action | question_id | answer_id | q_num | timestamp |
+------+--------+-------------+-----------+-------+-----------+
|    5 | show   |         285 |      NULL |     1 |       123 |
|    5 | answer |         285 |    124124 |     1 |       124 |
|    5 | show   |         369 |      NULL |     2 |       125 |
|    5 | skip   |         369 |      NULL |     2 |       126 |
+------+--------+-------------+-----------+-------+-----------+

我想用这个辅助表:

mysql> select question_id, if(action='show', 1, 0) as is_show, if(action='answer', 1, 0) as is_answer from survey_log;
+-------------+---------+-----------+
| question_id | is_show | is_answer |
+-------------+---------+-----------+
|         285 |       1 |         0 |
|         285 |       0 |         1 |
|         369 |       1 |         0 |
|         369 |       0 |         0 |
+-------------+---------+-----------+

接下来,我想做的是获取每个 question_id 的 is_show 和 is_answer 列的总和。我认为这会起作用:

mysql> select question_id, count(if(action = 'show', 1, 0)) as show_count, count(if(action = 'answer', 1, 0)) as answer_count from survey_log group by question_id;
+-------------+------------+--------------+
| question_id | show_count | answer_count |
+-------------+------------+--------------+
|         285 |          2 |            2 |
|         369 |          2 |            2 |
+-------------+------------+--------------+

但是,这并没有给我预期的输出

+-------------+------------+--------------+
| question_id | show_count | answer_count |
+-------------+------------+--------------+
|         285 |          1 |            1 |
|         369 |          1 |            0 |
+-------------+------------+--------------+

最后一个查询有什么问题?我查看了https://dev.mysql.com/doc/refman/8.0/en/counting-rows.html,但似乎无法将其应用于此问题。

【问题讨论】:

    标签: mysql count


    【解决方案1】:

    COUNT 只计算非空值。所以0 和1 都会被计算在内。你需要做的是SUM他们:

    select question_id, 
           sum(if(action = 'show', 1, 0)) as show_count,
           sum(if(action = 'answer', 1, 0)) as answer_count
    from survey_log
    group by question_id;
    

    请注意,由于 MySQL 在数字上下文中将布尔值视为 0(假)或 1(真),因此您可以删除查询的 if 部分:

    select question_id, 
           sum(action = 'show') as show_count,
           sum(action = 'answer') as answer_count
    from survey_log
    group by question_id;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多