【问题标题】:Replace NULL by default value in LEFT JOIN, but not in ROLLUP在 LEFT JOIN 中将 NULL 替换为默认值,但在 ROLLUP 中不替换
【发布时间】:2017-01-02 17:26:00
【问题描述】:

我有一个具有 LEFT JOIN、分组依据和 ROLLUP 的查询,如下所示:

Select * from
(
    Select user_agent,
    value,
    recoqty,
    count(recoqty) as C
    from august_2016_search_stats SS
    LEFT JOIN august_2016_extra E
        on (SS.id = E.stats_id and E.key = 'personalized')
    where time >= '2016-08-22 00:00:00' and
          time <= '2016-08-22 23:59:59' and
          query_type = 'myfeed' and
          recoqty = 'topics'
    group by recoqty,
             user_agent,
             value
    with ROLLUP
    having recoqty is not null
) D
order by C desc;

结果如下:

+------------+-------+---------+------+
| user_agent | value | recoqty | C    |
+------------+-------+---------+------+
| NULL       | NULL  | topics  | 1330 |
| abscdef    | NULL  | topics  | 1330 |
| abscdef    | NULL  | topics  | 1285 |
| abscdef    | 1     | topics  |   25 |
| abscdef    | 0     | topics  |   20 |
+------------+-------+---------+------+

这里,值 (NULL 1285) 是由于 LEFT JOIN,而值 (NULL 1330) 是由于汇总。 但是,有没有办法只为LEFT JOIN 而不是ROLLUP 替换NULL 值?

【问题讨论】:

    标签: mysql join rollup


    【解决方案1】:

    这有点棘手,因为来自您的数据的 NULL 值似乎与来自汇总的 NULL 值无法区分。一种可能的解决方法是首先执行非聚合查询,在该查询中,使用COALESCEvalue 列中的NULL 值替换为'NA' 或其他占位符。然后使用带有汇总的GROUP BY 将其聚合为子查询。那么NULL 列中的NULL 值肯定来自汇总,而不是您的实际数据。

    SELECT t.user_agent,
           t.value,
           t.recoqty,
           t.C
    FROM
    (
        SELECT user_agent,
               COALESCE(value, 'NA') AS value
               recoqty,
               COUNT(recoqty) AS C
        FROM august_2016_search_stats SS
        LEFT JOIN august_2016_extra E
            ON SS.id = E.stats_id AND
                  E.key = 'personalized'
        WHERE time >= '2016-08-22 00:00:00' AND
              time <= '2016-08-22 23:59:59' AND
              query_type = 'myfeed' AND
              recoqty = 'topics'
    ) t
    GROUP BY t.recoqty,
             t.user_agent,
             t.value
    WITH ROLLUP
    HAVING t.recoqty IS NOT NULL
    

    【讨论】:

    • 运行上述查询时会发生什么?
    • 所有 NULL 值都被替换为 NA
    • 首先使用COALESCE,然后使用子查询并进行汇总。
    • 您应该包含样本数据。没有这个我无法调试任何东西。
    猜你喜欢
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 2017-11-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多