[PHP-mySql] requête imbriquée

Petit nouveau ! | 6 Messages

17 mai 2011, 12:28

Bonjour à tous,
je me casse la tête sur la requête suivante :

J'ai une table ce_lqdj_pts avec les champs : lp_id (auto increment, primaire), lp_uid (id user), lp_pts (nombre de point par journée).
Pour obtenir le nombre de points cumulés lors de la derniere journée et créer un classement, pas de soucis :

Code : Tout sélectionner

$sql_pts = "SELECT lp_uid, SUM(lp_pts) AS pts_equipes FROM ce_lqdj_pts GROUP BY lp_uid ORDER BY pts_equipes DESC";
J'aimerais obtenir le nombre de points cumulés lors de la journée précédente (càd le classement sans le dernier lp_id de chaque lp_uid) et là je bloque, je ne dois pas etre tres loin du compte :

Code : Tout sélectionner

$sql_last_pts= "SELECT lp_id, lp_uid, SUM(lp_pts) AS pts_equipes FROM ce_lqdj_pts GROUP BY lp_uid HAVING NOT lp_id IN (SELECT MAX(lp_id) AS max_lpid FROM ce_lqdj_pts GROUP BY lp_uid) ORDER BY pts_equipes_ancien DESC";
J'obtiens le meme résultat que ma requete précédente, je bisque :twisted:
Merci pour votre aide #-o

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

17 mai 2011, 14:05

Bonjour,

Dans ta table il faut un champ date qui spécifie la date où le nombre de points par journée (lp_pts) a été constaté pour un user (lp_uid). Car la clé primaire auto-incrémentée (lp_id) n'est pas suffisante dans ce cas de calcul.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ViPHP
ViPHP | 2577 Messages

18 mai 2011, 09:23

Bonjour,

$sql_last_pts= "SELECT lp_id, lp_uid, SUM(lp_pts) AS pts_equipes FROM ce_lqdj_pts GROUP BY lp_uid HAVING NOT lp_id IN (SELECT MAX(lp_id) AS max_lpid FROM ce_lqdj_pts GROUP BY lp_uid) ORDER BY pts_equipes_ancien DESC";

La présence du lp_id (en gras) dans le select et son absence dans le group by me fait douter du fonctionnement de la requête. Peut être que MySQL le tolère, mais il prend lequel parmi les ceux lié à lp_uid.

A mon avis, il ne faut pas utiliser HAVING mais where. HAVING permet une sélection sur le "résultat du group by" (d'ou ton ajout dans les colonnes du select ?).
SELECT lp_uid, SUM(lp_pts) AS pts_equipes 
FROM ce_lqdj_pts 
where NOT lp_id IN (SELECT MAX(lp_id) AS max_lpid FROM ce_lqdj_pts GROUP BY lp_uid) 
GROUP BY lp_uid 
ORDER BY pts_equipes_ancien DESC

Invité
Invité n'ayant pas de compte PHPfrance

18 mai 2011, 10:38

Merci pour votre réponse.
Vous avez raison pour les dates, je n'y avez pas pensé

Code : Tout sélectionner

$sql_pts_ancien = "SELECT lp_id,lp_uid,lp_date,SUM(lp_pts) AS pts_equipes_ancien FROM ce_lqdj_pts GROUP BY lp_uid HAVING lp_date < MAX(lp_date) ORDER BY pts_equipes_ancien DESC";
Le souci, c'est que mon SUM(lp_pts) me donne tjrs la somme de tous les enregistrement et pas la somme de tous les enregistrements - le dernier en date.

Vous voyez une soluce ?

Petit nouveau ! | 6 Messages

18 mai 2011, 10:52

Merci Mazarini, ça marche et sans la date du jour, merci aussi a Sadeq pour son aide.
Génial =D>

ViPHP
ViPHP | 2577 Messages

18 mai 2011, 13:55

Bonjour,

Il faut comprendre que la clause WHERE fait une sélection sur les lignes de la table à prendre en compte alors que la clause HAVING fait une sélection sur les résultats après le calcul "group by".

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 mai 2011, 23:13

Modération :
Afin d'obtenir plus de réponses, le sujet a été déplacé dans un forum plus approprié.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer