代码之家  ›  专栏  ›  技术社区  ›  Amit Wagner

MySQL按日期分组小于多个日期

  •  0
  • Amit Wagner  · 技术社区  · 6 年前

    我认为这是一个困难的问题。 我需要将一张表按多个日期分组。棘手的是,我不需要将组作为具体日期,我需要的是所有值都小于日期。因此,如果只针对一个日期,我的查询将如下所示。

    select count(*) from users where created_at <= '2016-01-01'

    所以,我目前的糟糕解决方案是尽可能多地查询我拥有的日期。例如,如果我有10个日期的and数组,这意味着我的代码如下所示

    for(let i = 0; i< dates.length;i++){
      db.query(`select count(*) from users where created_at <= '${dates[i]}'`)
    }
    

    所需输出:

    dates  = [ '2016-06-01'  ,' 2016-04-01' ,'2016-02-01']
    
    
    table users:
    
    id | created_at
    1  | 2016-01-01
    2  | 2016-02-01
    3  | 2016-03-01
    4  | 2016-04-01
    5  | 2016-05-01
    6  | 2016-06-01
    
    
    outpout:
    
    date | count
    '2016-06-01' | 6
    '2016-04-01' | 4
    '2016-02-01' | 2
    

    有没有办法通过一个查询来实现这一点?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Smita Ahinave    6 年前

    //使用java解释了逻辑,但希望这会有所帮助:)

    您可以使用union来实现这一点, 首先计算所有日期并使用union进行查询,

    String sqlPart="";
    String union="";
    
    for(int i = 0; i< dates.length;i++){
      sqlPart=sqlPart+union;
      sqlPart=sqlPart + "SELECT created_at , count(*) FROM users WHERE created_at <= "+ dates[i];
      union="union";
    }
    

    因此,最终查询将在“sqlPart”中形成 然后运行此查询

        2
  •  1
  •   Chandan Rajput    6 年前

    有一种方法可以在一次数据库命中中获得它,是的,需要做一些合乎逻辑的事情:

    动态生成查询,如下所示:

    query = "SELECT " 
    for(let i = 0; i< dates.length;i++){
      if(i>0) query +=",";
      query += "SUM(if(created_at <='${dates[i]}',1,0))"; 
    }
    query += " from users ";
    

    如果您提前知道最长日期,请添加以下部分以更快地完成:

    query += " WHERE  created_at<= 'Maxdate' "; 
    

    最后点击数据库。

    db.query(query);
    

    在这里,您将得到如下结果: 6,4,2

    现在,这里的每个列值将给出相同数组序列中的日期计数。

    示例: 第一个值6是第一个数组值的计数,即2016-06-01,依此类推,可以根据需要以任何格式格式化。

    不过,你可以通过应用你的逻辑来更好地改进这一点。 这不是精确的编译代码,以它为参考来实现同样的功能。

        3
  •  0
  •   Sal00m Meera Verma    6 年前

    请检查此项:

    SELECT created_at , count(*) 
    FROM users 
    WHERE created_at < '2016-01-01' 
    GROUP BY created_at;
    

    查询将返回分组日期,其中包含每个日期的行数。