Ответ 1
GROUP BY YEAR(t.summaryDateTime), MONTH(t.summaryDateTime) DESC;
- это то, что вы хотите.
Учитывая таблицу с меткой времени в каждой строке, как бы вы отформатировали запрос, чтобы вписаться в этот конкретный формат json-объекта.
Я пытаюсь организовать 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(t.summaryDateTime), MONTH(t.summaryDateTime) DESC;
- это то, что вы хотите.
GROUP BY DATE_FORMAT(summaryDateTime,'%Y-%m')
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 для YEAR и Month, чтобы получить правильный порядок.
Я предпочитаю
SELECT
MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM
trading_summary t
GROUP BY EXTRACT(YEAR_MONTH FROM t.summaryDateTime) DESC";
Я знаю, что это старый вопрос, но следующее должно работать, если вам не нужно название месяца на уровне БД:
SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month
FROM trading_summary
GROUP BY summary_year_month;
См. документацию по функциям EXTRACT
.Вы, вероятно, найдете, что это лучше работает... и если вы создаете объект JSON на уровне приложения, вы можете выполнять форматирование/упорядочение при выполнении результатов.
N.B. Я не знал, что вы можете добавить DESC к предложению GROUP BY в MySQL, возможно, вам не хватает предложения ORDER BY:
SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month
FROM trading_summary
GROUP BY summary_year_month
ORDER BY summary_year_month DESC;
Вы должны сделать что-то вроде этого
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
используйте функцию EXTRACT, подобную этой
mysql> SELECT EXTRACT(YEAR FROM '2009-07-02');
-> 2009
Вы группируете только по месяцам, вам нужно добавить YEAR() в группу по
SELECT YEAR(t.summaryDateTime) as yr, GROUP_CONCAT(MONTHNAME(t.summaryDateTime)) AS month
FROM trading_summary t GROUP BY yr
Тем не менее вам нужно будет обработать его во внешнем script, чтобы получить именно ту структуру, которую вы ищете.
Например, используйте PHP explode для создания массива из списка имен месяцев, а затем используйте json_encode()
Вы также можете сделать это
SELECT SUM(amnt) 'value',DATE_FORMAT(dtrg,'%m-%y') AS label FROM rentpay GROUP BY YEAR(dtrg) DESC, MONTH(dtrg) DESC LIMIT 12
заказать по году и месяцу. Допустим, вы хотите сделать заказ с этого года и с этого месяца вплоть до 12 месяцев
Вот как я это делаю:
GROUP BY EXTRACT(YEAR_MONTH FROM t.summaryDateTime);
Использование
GROUP BY year, month DESC";
Вместо
GROUP BY MONTH(t.summaryDateTime) DESC";