Biorąc pod uwagę tabelę z sygnaturą czasową w każdym wierszu, jak sformatować zapytanie, aby pasowało do tego konkretnego formatu obiektu json.
Próbuję uporządkować obiekt json w lata / miesiące.
json, aby oprzeć zapytanie na:
{
"2009":["August","July","September"],
"2010":["January", "February", "October"]
}
Oto zapytanie, które mam do tej pory -
SELECT
MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM
trading_summary t
GROUP BY MONTH(t.summaryDateTime) DESC";
Kwerenda się psuje, ponieważ (w sposób przewidywalny) gromadzi się w różnych latach.
DATE_FORMAT(t.summaryDateTime, '%Y-%m')
DATE_FORMAT( FROM_UNIXTIME(t.summaryDateTime), '%Y-%m' )
GROUP BY YEAR(date), MONTH(date) DESC;
(~ 450 ms) iGROUP BY DATE_FORMAT(date,'%Y-%m')
(~ 850 ms) na tabeli InnoDB z> 300 000 wpisów wykazał, że pierwsza (zaznaczona odpowiedź na to pytanie) zajęła około połowę czasu niż druga.źródło
wolę
SELECT MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year FROM trading_summary t GROUP BY EXTRACT(YEAR_MONTH FROM t.summaryDateTime) DESC";
źródło
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
Aby uzyskać prawidłową kolejność, należy używać DESC zarówno dla ROKU, jak i miesiąca.
źródło
Wiem, że to stare pytanie, ale jeśli nie potrzebujesz nazwy miesiąca na poziomie bazy danych, poniższe powinno zadziałać:
SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month FROM trading_summary GROUP BY summary_year_month;
Zobacz dokumentację funkcji EXTRACT
Prawdopodobnie okaże się, że jest to bardziej wydajne ... a jeśli tworzysz obiekt JSON w warstwie aplikacji, możesz wykonać formatowanie / porządkowanie podczas przeglądania wyników.
NB nie wiedziałem, że możesz dodać DESC do klauzuli GROUP BY w MySQL, być może brakuje Ci klauzuli 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;
źródło
EXTRACT(YEAR_MONTH FROM summaryDateTime)
jest201901
Musisz zrobić coś takiego
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
źródło
Ty też to zrób
SELECT SUM(amnt) `value`,DATE_FORMAT(dtrg,'%m-%y') AS label FROM rentpay GROUP BY YEAR(dtrg) DESC, MONTH(dtrg) DESC LIMIT 12
zamawiać według roku i miesiąca. Powiedzmy, że chcesz zamawiać od tego roku i tego miesiąca aż do 12 miesiąca
źródło
Grupujesz tylko według miesiąca, musisz dodać ROK () do grupy według
źródło
użyj funkcji EXTRACT w ten sposób
mysql> SELECT EXTRACT(YEAR FROM '2009-07-02'); -> 2009
źródło
Oto jak to robię:
źródło
SELECT YEAR(t.summaryDateTime) as yr, GROUP_CONCAT(MONTHNAME(t.summaryDateTime)) AS month FROM trading_summary t GROUP BY yr
Nadal musisz przetworzyć to w zewnętrznym skrypcie, aby uzyskać dokładnie taką strukturę, której szukasz.
Na przykład użyj funkcji eksplodowania PHP, aby utworzyć tablicę z listy nazw miesięcy, a następnie użyj json_encode ()
źródło
Posługiwać się
Zamiast
źródło