2010-07-29 98 views
56

给定一个每行有时间戳的表,如何格式化查询以适应特定的json对象格式。在MySQL中按月份和年份分组

我想组织一个json对象成几年/几个月。

JSON立足查询关:

{ 
    "2009":["August","July","September"], 
    "2010":["January", "February", "October"] 
} 

下面是该查询我到目前为止 -

SELECT 
    MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year 
FROM 
    trading_summary t 
GROUP BY MONTH(t.summaryDateTime) DESC"; 

查询被打破,因为它(不出所料)不同年份混为一谈。使用

GROUP BY year, month DESC"; 

而不是

GROUP BY MONTH(t.summaryDateTime) DESC"; 

回答

117
GROUP BY YEAR(t.summaryDateTime), MONTH(t.summaryDateTime) DESC; 

+0

这个工程。非常感谢你! – 2010-07-29 21:04:08

+1

@德瑞克 - 没问题,乐意帮忙 – 2010-07-29 21:04:40

+36

+1:另一种替代方法是使用[DATE_FORMAT](http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date -format):'DATE_FORMAT(t.summaryDateTime,'%Y-%m')' – 2010-07-29 21:07:11

-2

是你想要的。

+0

相同的结果..... – 2010-07-29 21:01:50

+0

虽然看起来GROUP BY MONTH(t.summaryDateTime)DESC没有按由于某种原因,请妥善订购这些月份...... – 2010-07-29 21:03:24

+0

抱歉。 – Kyra 2010-07-29 21:17:08

0

您每月只进行分组,您必须通过

0
SELECT YEAR(t.summaryDateTime) as yr, GROUP_CONCAT(MONTHNAME(t.summaryDateTime)) AS month 
FROM trading_summary t GROUP BY yr 

添加YEAR()到该组还有你需要处理它在外部脚本获得正是你要寻找的结构。

例如使用PHP的爆炸来创建月份名称的列表数组,然后使用json_encode()

2

你必须做这样的事情

SELECT onDay, id, 
sum(pxLow)/count(*),sum(pxLow),count(`*`), 
CONCAT(YEAR(onDay),"-",MONTH(onDay)) as sdate 
FROM ... where stockParent_id =16120 group by sdate order by onDay 
5
SELECT MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year 
FROM trading_summary t 
GROUP BY YEAR(t.summaryDateTime) DESC, MONTH(t.summaryDateTime) DESC 

应该使用DESC为获得正确的订单。

1

使用EXTRACT函数这样

mysql> SELECT EXTRACT(YEAR FROM '2009-07-02'); 
     -> 2009 
4

我喜欢

SELECT 
    MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year 
FROM 
    trading_summary t 
GROUP BY EXTRACT(YEAR_MONTH FROM t.summaryDateTime) DESC"; 
42
GROUP BY DATE_FORMAT(summaryDateTime,'%Y-%m') 
+1

提供了详细信息,则需要使用-time-functions.html#function_from-unixtime。 – Parixit 2014-04-14 12:26:35

+0

欢迎来到StackOverflow!这是一个古老而已经回答的问题。如果您也可以提出更紧迫的问题,我们会很高兴。你可以找到提示,以提供很好的答案[这里](http://stackoverflow.com/help/how-to-answer)。 – Mifeet 2014-04-14 13:18:42