ifnull没有在mysql上工作

时间:2012-06-07 13:35:31

标签: mysql coalesce ifnull

我有下表:

+----+------------+----------+------------------+
| id | created_at | platform | platform_version |
+----+------------+----------+------------------+
|  1 |          1 | mac      | 1                |
|  2 |          2 | mac      | 1                |
|  3 |          3 | mac      | 2                |
|  4 |          4 | mac      | 2                |
|  5 |          5 | mac      | 2                |
|  6 |          5 | mac      | 3                |
|  7 |          2 | windows  | 1                |
|  8 |          2 | windows  | 2                |
|  9 |          3 | windows  | 3                |
| 10 |          3 | windows  | 1                |
| 11 |          4 | windows  | 2                |
| 12 |          4 | windows  | 3                |
| 13 |          5 | windows  | 4                |
| 14 |          5 | windows  | 1                |
| 15 |          6 | windows  | 2                |
| 16 |          6 | windows  | 3                |
+----+------------+----------+------------------+

我希望得到如下结果:

+-------------+---------------+---------------+------------+
| group_count | running_total | windows_total | created_at |
+-------------+---------------+---------------+------------+
|           1 |             1 |             0 |          1 |
|           6 |             7 |             4 |          2 |
|           7 |            14 |             8 |          4 |
|           2 |            16 |            10 |          6 |
+-------------+---------------+---------------+------------+

但是当我执行这个select语句时:

SELECT group_count,
       (@r := @r + group_count ) AS running_total,
       (@w := @w + ifnull( win_count, 0 )) AS windows_total,
       t1.created_at
FROM  (SELECT   (@r :=0),
                COUNT( * ) AS group_count,
                platform,
                created_at
       FROM     devices
       GROUP BY created_at DIV 2
      ) AS t1 LEFT JOIN
      (SELECT   COUNT( * ) AS win_count,
                created_at
       FROM     devices
       WHERE    platform = 'windows'
       GROUP BY created_at DIV 2
      ) AS t3 ON t1.created_at = t3.created_at

它是这样的:

+-------------+---------------+---------------+------------+
| group_count | running_total | windows_total | created_at |
+-------------+---------------+---------------+------------+
|           1 |             1 |          NULL |          1 |
|           6 |             7 |          NULL |          2 |
|           7 |            14 |          NULL |          4 |
|           2 |            16 |          NULL |          6 |
+-------------+---------------+---------------+------------+

合并也不起作用。有人可以帮忙吗?感谢。

1 个答案:

答案 0 :(得分:0)

为了记录,我引用@ eggyal的回答:

@w最初为NULL,因此将其添加到IFNULL的结果(无论结果是什么)都会产生NULL 像在@r

中一样,在subselect中给它一个初始值
SELECT group_count,
       (@r := @r + group_count ) AS running_total,
       (@w := @w + ifnull( win_count, 0 )) AS windows_total,
       t1.created_at
FROM  (SELECT   (@r:= 0),(@w:= 0),
                COUNT(*) AS group_count,
                platform,
                created_at
       FROM     devices
       GROUP BY created_at DIV 2
      ) AS t1 LEFT JOIN
      (SELECT   COUNT( * ) AS win_count,
                created_at
       FROM     devices
       WHERE    platform = 'windows'
       GROUP BY created_at DIV 2
      ) AS t3 ON t1.created_at = t3.created_at

这应该可以解决问题。