我在mysql中有2个表记录某个事件发生的日期。
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
答案 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))
请注意,此处table1.date
优先于table2.session_date
,如果您希望以另一种方式改变COALESCE
中的订单。