2009-06-04 1 views
1

ОК У меня есть этот запрос, группы 2 колонки вместе довольно красиво:MySQL: группа по дате RANGE?

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 вместо просто свидание? Есть ли способ сделать это?

Спасибо!

EDIT: ОК эти ответы довольно сложны, и я думаю, что то, что я хочу, может быть достигнуто намного проще, поэтому позвольте мне объяснить его. Я хочу выбрать ключевые слова за период времени>> = 20090601 И < = 20090604 "например. Но вместо того, чтобы повторять ключевые слова, я предпочел бы просто получить ключевое слово ounce и сколько раз это происходило. Так, например, вместо этого:

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

Я хотел бы получить:

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

Мне больно видеть постоянные переменные независимо от контекста безопасности. Заполнители - ваши друзья. – Trey

+0

@ Как вы еще это делаете? –

+0

Это зависит от вашего языка и клиентской библиотеки базы данных. Google - название вашей библиотеки и «placeholder». –

ответ

3

Я не совсем уверен насчет диапазона дат группировки - вы должны определить дату, начиная, что вы хотите, и тогда, может быть, вы могли бы UNION эти запросы:

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 

EDIT: Bas ред на дополнительной предоставленной вами информации, этот запрос должен производить то, что вы хотите:

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 
+0

Есть ли способ изменить последний запрос, чтобы охватить несколько диапазонов search_query_date? В этом случае возвращаемые столбцы будут (ключевое слово, столбец, неделя), и вы можете запустить запрос для возврата результатов за последние 6 недель? – JBCP

2

Вы могли бы группу на сазе или на результат функции. Например:

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 
+0

Что делает QUARTER()? –

+0

«Возвращает четверть года на дату, в диапазоне от 1 до 4.» - http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html # function_quarter – aland

0

взгляд в различные функции DATE основе и строить на его основе, такие как

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

, но результат в выше случае необходимо будет преобразовать в символ, чтобы предотвратить год 2009 + январь (месяц 1) = 2010 также становится ложно сгруппирован с 2008 + февраль (месяц 2) = 2010 и т. д. Ваша строка должна закончиться чем-то вроде :

... 
200811 
200812 
200901 
200902 
200903 
... 

Если вы хотите календарное Quarters, вы должны сделать INTEGER из (месяца -1) делится на 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... 

Да, предыдущий пример явно ссылаться на функции КВАРТАЛА() который обрабатывает более красиво, но если вы также делаете на основе старения, например 30, 60, 90 дней, вы можете применить аналогичную математику выше, но делите на 30 для своих групп.