2010-07-29 9 views
56

Étant donné une table avec un horodatage sur chaque ligne, comment formateriez-vous la requête pour qu'elle corresponde à ce format d'objet json spécifique. J'essaie d'organiser un objet JSON en années/mois.Grouper par mois et par année dans MySQL

JSON pour fonder la requête de:

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

Voici la requête que j'ai à ce jour -

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

La requête se délite parce qu'il est (on pouvait s'y attendre) amalgamer les différentes années .

Répondre

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

est ce que vous voulez.

+0

cela fonctionne. Merci beaucoup! –

+1

@Derek - pas de problème, heureux d'aider –

+36

+1: Une autre alternative utilisant [DATE_FORMAT] (http://dev.mysql.com/doc/refman/5.1/fr/date-and-time-functions.html#function_date -format): 'DATE_FORMAT (t.summaryDateTime, '% Y-% m')' –

-2

Utilisez

GROUP BY year, month DESC"; 

Au lieu de

GROUP BY MONTH(t.summaryDateTime) DESC"; 
+0

même résultat ..... –

+0

bien qu'il semble que GROUPE PAR MOIS (t.summaryDateTime) doesn DESC 't commander les mois correctement pour une raison quelconque ... –

+0

oups désolé à ce sujet. – Kyra

0

Vous regroupez par mois seulement, vous devez ajouter AN() au groupe par

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

Pourtant, vous auriez besoin de le traiter dans le script externe pour obtenir exactement la structure que vous recherchez.

Par exemple, utilisez exploser de PHP pour créer un tableau de la liste des noms de mois puis utilisez json_encode()

2

Vous devez faire quelque chose comme ça

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 

devrait utiliser DESC ANNÉE et Mois pour obtenir l'ordre correct.

1

utiliser la fonction EXTRACT comme celui-ci

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

Je préfère

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

fournissent des détails. – Parixit

+0

Bienvenue dans StackOverflow! C'est une question ancienne et déjà répondue. Nous serons heureux si vous pouviez contribuer à des questions plus urgentes. Vous pouvez trouver des conseils pour fournir de bonnes réponses [ici] (http://stackoverflow.com/help/how-to-answer). – Mifeet

Questions connexes