代码之家  ›  专栏  ›  技术社区  ›  dialogik

如何加入静态值并将其用作GROUP BY标识符?

  •  0
  • dialogik  · 技术社区  · 11 年前

    我创建了一个 SELECT 语句,其中我获取从现在到数据库中某个日期的时间差。

    SELECT
        `username`,
        TIMESTAMPDIFF(HOUR, `a_date`, NOW()) AS `timediff`
    FROM
        `User`
    

    …导致类似

    username | timediff
    -------------------
    john     |      441
    henry    |     1624
    mike     |        4
    kyle     |     NULL
    

    现在我想将他们分成预先定义的组,例如。

    • NULL
    • less than 20
    • greater than 20

    我怎么能 JOIN 上面的结果是一组静态的预定义值,我如何使用这些值作为我的分组标识符?

    group | amount
    --------------
    NULL  |      1
    lt 20 |      1
    gt 20 |      2
    
    1 回复  |  直到 11 年前
        1
  •  1
  •   Gordon Linoff    11 年前

    您可以使用 case 带有的语句 group by :

    SELECT (CASE WHEN TIMESTAMPDIFF(HOUR, `a_date`, NOW()) < 20 THEN 'lt 20'
                 WHEN TIMESTAMPDIFF(HOUR, `a_date`, NOW()) >= 20 THEN 'gt 20'
            END) as grp, COUNT(*)
    FROM `User`
    GROUP BY grp;
    

    作为补充说明:我通常重复 案例 中的语句 分组依据 ,因为许多数据库不允许有列别名:

    SELECT (CASE WHEN TIMESTAMPDIFF(HOUR, `a_date`, NOW()) < 20 THEN 'lt 20'
                 WHEN TIMESTAMPDIFF(HOUR, `a_date`, NOW()) >= 20 THEN 'gt 20'
            END) as grp, COUNT(*)
    FROM `User`
    GROUP BY (CASE WHEN TIMESTAMPDIFF(HOUR, `a_date`, NOW()) < 20 THEN 'lt 20'
                   WHEN TIMESTAMPDIFF(HOUR, `a_date`, NOW()) >= 20 THEN 'gt 20'
              END);