MySQL:按日期分组RANGE?

时间:2009-06-04 17:45:18

标签: mysql group-by

好的我有这个查询可以很好地将2列组合在一起:

SELECT search_query_keyword, search_query_date, COUNT(1) as count
            FROM search_queries 
            WHERE search_query_date >= '.$from.' AND search_query_date <= '.$to.'
            GROUP BY search_query_keyword, search_query_date
            ORDER BY count DESC
            LIMIT 10

但是如果我想按日期RANGE分组而不仅仅是约会呢?有没有办法做到这一点?

谢谢!

编辑:好的,这些答案非常复杂,我认为我想要的更容易实现,所以让我重新解释一下。我想在一段时间内选择关键字“&gt; = 20090601 AND&lt; = 20090604”。但不是重复关键字我宁愿只得到关键字盎司和它发生了多少次。例如,而不是:

keyword: foo
keyword: foo
keyword: foo
keyword: bar
keyword: bar

我会得到:

keyword: foo, count: 3
keyword: bar, count: 2

3 个答案:

答案 0 :(得分:3)

我不完全确定日期范围分组 - 你必须定义你想要的日期范围,然后你可以联合这些查询:

SELECT 
    'Range 1' AS 'date_range',
    search_query_keyword
FROM search_queries
WHERE search_query_date >= '.$fromRange1.' AND search_query_date <= '.$toRange1.'
UNION
SELECT 
    'Range 2' AS 'date_range',
    search_query_keyword
FROM search_queries
WHERE search_query_date >= '.$fromRange2.' AND search_query_date <= '.$toRange2.'
GROUP BY 1,2

或者如果你想把它们放在像“30天,60天等”那样多天的分组中,你可以这样做:

SELECT 
    (DATEDIFF(search_query_date, NOW()) / 30) AS date_group,
    search_query_keyword
FROM search_queries
GROUP BY date_group, search_query_keyword

编辑:根据您提供的更多信息,此查询应生成您想要的内容:

SELECT 
    search_query_keyword,
    COUNT(search_query_keyword) AS keyword_count
FROM search_queries
WHERE search_query_date >= '.$from.' AND search_query_date <= '.$to.'
GROUP BY search_query_keyword

答案 1 :(得分:2)

您可以对CASE语句或函数的结果进行分组。例如:

SELECT search_query_keyword, QUARTER(search_query_date), COUNT(1) as count
FROM search_queries 
WHERE search_query_date >= '.$from.' AND search_query_date <= '.$to.'
GROUP BY search_query_keyword, QUARTER(search_query_date)
ORDER BY count DESC

答案 2 :(得分:0)

查看不同的基于DATE的函数,并根据它构建,例如

select  YEAR( of your date ) + MONTH( of your date ) as ByYrMonth

但上述情况下的结果需要转换为字符,以防止2009年+ 1月(第1个月)= 2010年也错误地与2008 + 2月(第2个月)= 2010年等组合... ...字符串最终应该像:

...
200811
200812
200901
200902
200903
...

如果你想通过日历Quarters,你必须做(月-1)的INTEGER除以4,所以......

Jan (-1) = 0 / 4 = 0
Feb (-1) = 1 / 4 = 0
Mar (-1) = 2 / 4 = 0
Apr (-1) = 3 / 4 = 0
May (-1) = 4 / 4 = 1
June (-1)= 5 / 4 = 1 ... etc...

是的,前一个示例明确引用了处理更好的QUARTER()函数,但是如果还基于老化,例如30,60,90天,您可以应用上面的类似数学但是除以30为你的基团。