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 16/03/2011, 13h30   #1
Membre éprouvé
 
Homme Gaetan
Webmaster
Inscription : janvier 2007
Messages : 386
Détails du profil
Informations personnelles :
Nom : Homme Gaetan
Âge : 40
Localisation : France

Informations professionnelles :
Activité : Webmaster
Secteur : Biens de consommation

Informations forums :
Inscription : janvier 2007
Messages : 386
Points : 441
Points : 441
Envoyer un message via MSN à Gaetan_
Par défaut Jointure sur 3 tables

Bonjour,

Pardon mais je scotch sur une requête...
J'ai 3 tables :

ma table article :
articles: articleID | dispo (0/1)
ma table commandes :
commandes : comID | clientID | ...
ma table détail commandes :
com_det : comID | articleID | qte | pht | ...

Je voudrais ressortir l'ID article (articleID) disponible (dispo=1) qu'un client (clientID) a le plus commandé (SUM(qte)) parmi toutes ses commandes (comID).
Si plusieurs articles ont été commandés à quantité égale, l'ordre doit être celui du prix décroissant (ORDER BY pht DESC LIMIT 1).

Si quelqu'un pouvait me donner un petit coup de pouce ce serait fabuleux.

Merci
Gaetan_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 14h10   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Qu'est ce cette requête donne ?
Code :
1
2
3
4
5
6
7
8
9
SELECT c.clientID,a.articleID,sum(d.qte),max(a.pht)
  FROM commandes c
  JOIN com_det d ON c.comID = d.comID
  JOIN article a ON d.articleID = a.articleID
 WHERE c.clientID = ?
   AND a.dispo = 1
 GROUP BY c.clientID,a.articleID
 ORDER BY sum(d.qte) DESC, max(a.pht) DESC, a.articleID
 LIMIT 1
J'ai utilisé max(a.pht) pour récupérer le prix de chaque article sans faire de sous requête, à priori comme il n'y a qu'un prix par article max ou min ne devrait pas modifier le résultat, mais à confirmer.

J'ai rajouté a.artcileID dans le tri au cas où 2 articles aient la même quantité commandée et le même prix, comme ça le résultat est déterministe, le besoin semblant être de ne remonter qu'1 seul article.

S'il faut remonter tous les articleID concernés, alors il faudra passer par une sous requête un peu chiante à réaliser car mysql ne connaît pas rank.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 14h35   #3
Membre éprouvé
 
Homme Gaetan
Webmaster
Inscription : janvier 2007
Messages : 386
Détails du profil
Informations personnelles :
Nom : Homme Gaetan
Âge : 40
Localisation : France

Informations professionnelles :
Activité : Webmaster
Secteur : Biens de consommation

Informations forums :
Inscription : janvier 2007
Messages : 386
Points : 441
Points : 441
Envoyer un message via MSN à Gaetan_
Merci skuatamad.

Mes connaissances en requêtes sont limitées au b a ba.

Citation:
ERREUR Unknown column 'a.articleID' in 'field list'
Je remplace donc les a.articleID par articles.articleID

etc?
Gaetan_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 15h09   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
J'ai écrit article à la place d' articles. Sinon pour les alias je trouve ça plus lisible et mysql les supporte évidemment, essaie en écrivant
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 15h22   #5
Membre éprouvé
 
Homme Gaetan
Webmaster
Inscription : janvier 2007
Messages : 386
Détails du profil
Informations personnelles :
Nom : Homme Gaetan
Âge : 40
Localisation : France

Informations professionnelles :
Activité : Webmaster
Secteur : Biens de consommation

Informations forums :
Inscription : janvier 2007
Messages : 386
Points : 441
Points : 441
Envoyer un message via MSN à Gaetan_
Arf... non j'aurais du faire attention.

Je colle donc la requête avec un ID client valide, x commandes mais rien :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
$clientID='23760';
$requete = mysql_query("SELECT c.clientID,a.articleID,sum(d.qte),max(a.pht)
  FROM commandes c
  JOIN com_det d ON c.comID = d.comID
  JOIN articles a ON d.articleID = a.articleID
 WHERE c.clientID = '$clientID'
   AND a.dispo = '1'
 GROUP BY c.clientID,a.articleID
 ORDER BY sum(d.qte) DESC, max(a.pht) DESC, a.articleID
 LIMIT 1"); 
 $articleID = mysql_result($requete,0,"a.articleID");
Gaetan_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 15h27   #6
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Tu peux tester la requête directement dans phpmyadmin avec le bon clientID stp ?
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 15h33   #7
Membre éprouvé
 
Homme Gaetan
Webmaster
Inscription : janvier 2007
Messages : 386
Détails du profil
Informations personnelles :
Nom : Homme Gaetan
Âge : 40
Localisation : France

Informations professionnelles :
Activité : Webmaster
Secteur : Biens de consommation

Informations forums :
Inscription : janvier 2007
Messages : 386
Points : 441
Points : 441
Envoyer un message via MSN à Gaetan_
Erf...pardon resultat NULL

Il fallait interroger ma table factures et non commandes (dont le détail disparait après facturation)

Un Immense Merci et un grand Bravo !
Gaetan_ est dé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 19h02.


 
 
 
 
Partenaires

Hébergement Web