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

时间:2018-04-12 10:14:48

标签: mysql

这是一个艰难的(我认为)。 我需要按多个日期对表格进行分组。棘手的部分是我不需要该组作为特定日期,我需要它是比日期更小的所有值。因此,如果只有一个日期,我的查询将会是这样的。

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

所以我当前并且依赖于糟糕的解决方案就是尽可能多地查询我所拥有的日期。例如,如果我有和10个日期的数组,这意味着我的代码将是这样的

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

有没有办法用1个查询来实现这个目的?

3 个答案:

答案 0 :(得分:1)

//使用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'中形成 然后运行此查询

答案 1 :(得分:1)

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

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

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,依此类推,可以根据需要以任何格式进行格式化。

仍然可以通过应用逻辑事物来改善这一点。 这不是精确的编译代码,请将其作为参考来实现相同的目的。

答案 2 :(得分:0)

请检查:

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

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