Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/11/2011, 16h42   #1
Nouveau Membre du Club
 
Femme
Inscription : janvier 2010
Messages : 78
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : janvier 2010
Messages : 78
Points : 25
Points : 25
Par défaut PB de requete avec MAX

Exposé du pb
J'ai une table ACTIONS qui liste un ensemble d'actions faites sur des clients, pour chaque action on a une date d'action.
Je voudrais faire une requête SQL qui me permette de lister la dernière action (nature)faite sur chaque client.
Pour cela je fais une requête qui me semble toute simple :
Code :
SELECT DISTINCT MAX(actions_datejour) AS date,actions_client,actions_nature FROM actions GROUP BY actions_datejour,actions_client
Le résultat me donne par exemple pour un client qui a deux actions sur son compte : les deux dates (différentes), les deux natures d'actions et le n° de client.
Or je voudrais la dernière action faite sur le compte client c'est à dire une ligne par client avec la date la plus récente ainsi que la nature de l'action.

Merci pour votre aide
naroco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 16h52   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Problème posé ici de manière récurrente.
Inspire-toi de cet exemple.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 16h55   #3
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 652
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 652
Points : 2 653
Points : 2 653
Bonjour,

En fait ceci est dû à votre clause GROUP BY, vous agrégez sur les actions et les dates alors qu'il faudrai plutot le faire sur le client uniquement.



Donc une piste :
Code :
1
2
3
4
5
6
7
8
 
SELECT *
FROM actions_nature a
INNER JOIN actions_client b ON a.id_nature = b.id_nature
INNER JOIN (
SELECT id_client, max(date_action) AS date_action
FROM actions_client
GROUP BY id_client) c ON b.id_client = c.id_client AND b.date_action = c.date_action
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 17h07   #4
Nouveau Membre du Club
 
Femme
Inscription : janvier 2010
Messages : 78
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : janvier 2010
Messages : 78
Points : 25
Points : 25
Par défaut merci Punkoff

En fait, tu me disais que le pb venait du group by.
Code :
SELECT DISTINCT MAX(actions_datejour) AS date,actions_client,actions_nature FROM actions GROUP BY actions_client
j'ai en effet uniquement mis le client dans la clause group by et ça fonctionne je n'ai apparemment qu'une ligne par client
naroco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 17h17   #5
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Oui mais rien ne t'assure que actions_client et actions_nature soient bien ceux de MAX(actions_datejour).
Le GROUP BY fait perdre la dépendance fonctionnelle entre les colonnes.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 17h23   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 652
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 652
Points : 2 653
Points : 2 653
s'il a une date qui réfère 2 actions, dans ce cas la requete retourne 2 lignes, donc fonctionnellement c'est juste

T'as solution est mieux s'il dispose de clef auto-incrémentée, sinon pas le choix.
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h23.


 
 
 
 
Partenaires

Hébergement Web