J'ai un tableau de données:
id | name | userid | score | date |
--------------------------------------------------------
1 | john | 4 | 233 | 2014-02-02
2 | mary | 5 | 1256 | 2013-02-05
3 | john | 6 | 100 | 2013-03-08
4 | elvis | 7 | 123 | 2013-03-04
5 | john | 2 | 1234 | 2013-03-02
Je veux montrer les détails des meilleurs scores hebdomadaires du mois dernier. Chaque semaine, maximum 4 meilleurs marqueurs. Mes données seront imprimées au format JSON.
Actuellement, le résultat de ma requête ne montre que le résultat de la dernière semaine.
"weekly_winners":[
{
"id":"2",
"score":"1256"
},
{
"id":"1",
"score":"233"
}
],
Mais je veux montrer ressembler
"weekly_winners":[
"week":"1"
[
{
"id":"2",
"score":"1256"
},
{
"id":"1",
"score":"233"
}
],
"week":"2"
[
{
"id":"2",
"score":"1256"
},
{
"id":"1",
"score":"233"
}
],
],
Ma requête actuelle est:
SELECT winner.id,winner.score
FROM `winner` AS winner
WHERE winner.date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND winner.date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY
ORDER BY winner.score DESC
LIMIT 4
Réponses:
1 pour la réponse № 1Vous pouvez faire le regroupement avec le YEARWEEK()
commander. Regarde ça poster en faisant dimanche le début de la semaine.
Pour que vous puissiez utiliser: YEARWEEK(winner.date, 0)
préciser la semaine.
En ce qui concerne la sélection des N premières lignes par groupe, la meilleure référence que j’ai trouvée pour le faire est ici. Faites défiler jusqu'à la section:
Sélectionnez les N premières lignes de chaque groupe
J'ai utilisé cet article pour résoudre ce problème dans le passé.
*Remarque: YEARWEEK()
gérera la nouvelle année en mettant toutes les dates jusqu'au jour spécifié pour commencer une nouvelle semaine dans la dernière semaine de l'année précédente ... comme vous le souhaitiez
MODIFIER:
Voici une requête possible (sélectionne les deux premiers pour éviter un tas de données pour l'exemple de violon):
SELECT winner.id,winner.score, YEARWEEK(winner.date, 0)
FROM `winner` AS winner
WHERE (
SELECT count(*)
FROM winner as w
WHERE YEARWEEK(w.date, 0) = YEARWEEK(winner.date, 0)
AND w.score >= winner.score
) <= 2;