繁体   English   中英

根据mysql中的计算字段对数据进行分组和计数?

[英]Group and count data based on a calculated field in mysql?

我在mysql中有2个表,记录某个事件发生的日期。

  • 表1:(id,session_id,日期)
  • 表2:(id,session_date)

Table1是主表,我只写session_id(在这种情况下,日期是从Table2的匹配记录中提取的)或日期。 我没有填写的字段保持为NULL。

现在,我想计算该事件每月/每年发生了多少次,并且,如果可能的话,请仅在特定日期(例如2013年1月1日)之后执行该过程。

到目前为止,这是我所做的事情,我创建了另一个日期字段(称为date_final),该日期字段每行包含非NULL值,因此我试图根据该字段对数据进行分组。

SELECT table1.date AS date1, 
       table2.session_date AS date2, 
       @date_final := CONCAT_WS('', table1.date, table2.session_date) AS date_final,
       MONTHNAME(@date_final) AS `month`,
       YEAR(@date_final) AS `year`   
FROM table1
LEFT JOIN table2 ON table2.id = table1.session_id
GROUP BY YEAR(@date_final), MONTH(@date_final)

显然,这种方法效果不佳,因此我在这里。 MySQL每月/每年只向我返回一些值,这不好。 当我添加COUNT(*)子句时,情况甚至更糟。 我只是mysql的新手,我想我在这里进入深水:P

##Sample data for Table1##
#id  session_id  date#
1            1  NULL
2         NULL  2013-01-04
3            2  NULL
4         NULL  2013-01-20
5         NULL  2013-02-22
6            3  NULL

##Sample data for Table2##
#id  session_date#
1       2013-01-02
2       2013-01-10
3       2013-03-02

预期成绩? 就像是:

2013  January  3
2013  February 2
2013  March    1

一种可能是您打算:

SELECT table1.date AS date1, 
       table2.session_date AS date2, 
       coalesce(table1.date, table2.session_date) AS date_final,
       MONTHNAME(coalesce(table1.date, table2.session_date)) AS `month`,
       YEAR(coalesce(table1.date, table2.session_date)) AS `year`   
FROM table1 LEFT JOIN
     table2
     ON table2.id = table1.session_id
GROUP BY MONTHNAME(coalesce(table1.date, table2.session_date)),
         YEAR(coalesce(table1.date, table2.session_date))
order by `month`, `year`;

为此,您不需要会话变量。

因为可靠地使用它们的规则并不简单,所以删除会话变量,您似乎正在寻找的是带有COALESCELEFT JOIN ,类似;

SELECT 
  YEAR(COALESCE(table1.date, table2.session_date)) year,
  MONTHNAME(COALESCE(table1.date, table2.session_date)) month,
  COUNT(*) cnt
FROM table1
LEFT JOIN table2 ON table1.session_id = table2.id
GROUP BY year, month
ORDER BY year, MONTH(COALESCE(table1.date, table2.session_date))

要使用进行测试的SQLfiddle

请注意,这里的table1.date优先于table2.session_date ,如果您希望以另一种方式,则必须将COALESCE的顺序颠倒。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM