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
    Membre averti
    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
    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 émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    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
    Membre averti
    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
    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
    Membre averti
    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
    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 émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    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
    Membre averti
    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
    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: 12/10/2009, 23h22
  2. [SSIS][2k5] jointure avec condition
    Par Jenormand dans le forum SSIS
    Réponses: 4
    Dernier message: 11/07/2008, 10h51
  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, 21h05
  4. Jointure avec condition
    Par Mookie dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 20/05/2007, 22h32
  5. Jointure avec conditions sur plusieurs colonnes
    Par ben53 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 28/11/2005, 09h27

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