/ / Vous voulez afficher les détails du meilleur marqueur hebdomadaire groupés par mois - php, mysql, codeigniter

Vous voulez afficher les détails hebdomadaires sur les meilleurs scores, regroupés par mois - php, mysql, codeigniter

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 № 1

Vous 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;

exemple sqlFiddle