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

时间:2013-12-28 18:52:22

标签: mysql group-by field

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

  • 表1:(id,session_id,date)
  • 表2:(id,session_date)

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

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

这是我到目前为止所做的,我创建了另一个日期字段(称为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

2 个答案:

答案 0 :(得分: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`;

您不需要会话变量。

答案 1 :(得分:0)

删除会话变量,因为可靠地使用它们的规则不是直截了当的,你似乎要寻找的是LEFT JOIN COALESCE,类似于;

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))

An SQLfiddle to test with

请注意,此处table1.date优先于table2.session_date,如果您希望以另一种方式改变COALESCE中的订单。