IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

jointure avec condition [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Points : 26
    Points
    26
    Par défaut jointure avec condition
    Bonjour
    J'ai 2 tables, 1 avec des clients l'autre avec des commandes. Jusque là pas de problème.
    Je voudrais lister tout les clients avec le montant de leur dernière commande.
    Donc il me faudra une requete de type:

    SELECT idClient, montantHT
    FROM clients, commandes
    WHERE clients.idClient=commandes.idClient
    AND date IS MAX.

    Sauf que date IS MAX ça n'existe pas.

    Existe t il une solution avec un seul requete ?

    J'ai essayé avec des ORDER, des LIMIT, des LEFT JOIN et je ne sais plus quoi encore, mais là je sèche.

    Merci de votre aide.

    Marochlo

  2. #2
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    J'ai eu une truc à faire comme y a pas longtemps et j'ai du le faire en deux requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT clients.idClient
    FROM clients, commandes
    WHERE clients.idClient=commandes.idClient
    Ensuite tu fais ta boucle pour parcourir les résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while($JeuEnr=mysql_fetch_assoc($requete){
     
           $requete2=mysql_query("SELECT montantHT FROM clients, commandes
    WHERE clients.idClient=commandes.idClient and clients.idClient=".$JeuEnr[idClient]." AND Date=(SELECT MAX(Date) FROM commandes WHERE idClient=".$JeuEnr['idClient'].")",$cnx) or die(mysql_error());
           $JeuEnr2=mysql_fetch_assoc($requete2);
           echo $JeuEnr2['montantHT'];
           mysql_free_result($requete2);
     
    }
    Mais y a surement plus optimisé

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Points : 26
    Points
    26
    Par défaut en fait c'est simple
    Je donne la réponse tellement j'ai honte d'avoir posé cette question.
    C'est en fait très simple avec une sous requête.

    SELECT idClient, montantHT
    FROM clients, commandes
    WHERE clients.idClient=commandes.idClient
    AND date =(SELECT MAX(date) FROM commandes WHERE clients.idClient=commandes.idClient)

    ça marche très bien et c'est super simple.


    Marochlo

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    merci obito
    Le solution avec 2 requêtes ne me plaisait pas trop, mais avec une sous requête comme je viens de trouver, ça marche plutôt bien et comme je voulais.

    Merci de ta réponse

  5. #5
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    Lol au final on avait la même chose^^ mais bon en une requete ca marche bien tant mieux

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 408
    Points : 23 800
    Points
    23 800
    Par défaut
    Citation Envoyé par marochlo Voir le message
    C'est en fait très simple avec une sous requête.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT idClient, montantHT
    FROM clients, commandes
    WHERE clients.idClient=commandes.idClient
    AND date =(SELECT MAX(date) FROM commandes WHERE clients.idClient=commandes.idClient)
    Ce n'est pas tout-à-fait correct car tu utilises une fonction d'agrégation sans GROUP BY. C'est toléré par certains SGBD, mais ce n'est pas une norme. La même ou presque sous PostGreSQL :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select client,occurence,montant 
      from commandes 
     where (client,occurence) in (select client,max(occurence)
                                    from commandes
                                group by client
                                order by client)
     order by client;

    Ce serait encore mieux si tu avais un champ idCommande.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    Bonjour
    Merci Obisidian de cette précision.
    Je dois dire que la requête est en fait beaucoup plus complexe que ce que j'ai écrit, mais j'ai simplifié pour garder l'essentiel.
    On récupère aussi des codes produits, des types clients, des adresses, des fournisseurs etc. Mais un fois trouvé le numéro de la dernière commande le reste était très simple.
    Il y a un champ idCommande dans la table, mais compte tenu de la structure et de l'historique le dernier numéro n'est pas obligatoirement la dernière date.

    Je vais donc réécrire ma requête avec un GROUP BY pour respecter la norme.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Jointures avec conditions
    Par FMJ dans le forum Requêtes et SQL.
    Réponses: 37
    Dernier message: 13/10/2009, 00h22
  2. [SSIS][2k5] jointure avec condition
    Par Jenormand dans le forum SSIS
    Réponses: 4
    Dernier message: 11/07/2008, 11h51
  3. [2000] Un "casse tete" de requete :) Jointure avec conditions
    Par yepAccess dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 11/04/2008, 22h05
  4. Jointure avec condition
    Par Mookie dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 20/05/2007, 23h32
  5. Jointure avec conditions sur plusieurs colonnes
    Par ben53 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 28/11/2005, 10h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo