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

Requêtes MySQL Discussion :

Probleme condition de jointure "min"


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 13
    Par défaut Probleme condition de jointure "min"
    Bonjour à tous

    voici mon problème

    Pour faire simple, je vend au détail des livres proposés par des fournisseurs.

    J'ai donc une table livre, une fournisseur et une prix

    livre a 2 colonnes : id, titre
    fournisseur a 2 colonnes : id, nom
    prix a 4 colonnes: id, prix, livre_id, fournisseur_id,

    je voudrais que ma requete retourne pour tous mes livres le prix minimum ainsi que le fournisseur correspondant à ce prix soit un truc du genre

    livre id | livre titre | prix | fournisseur_id
    --- 1 --- da vinci -- 33 ---- 7
    --- 2 --- la marq ---12 ---- 4
    --- 3 --- indignez -- 50 ---- 1
    ...

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT L.id , L.titre , p.prix , p.fournisseur_id
    FROM livre L
    LEFT JOIN prix p ON (p.livre_id = L.id AND (p.prix = 
             (SELECT MIN(prix)
              FROM prix
              WHERE prix.livre_id = L.id))
    GROUP BY L.id
    Ce code me renvoie NULL pour les colonnes p.prix et p.fournisseur_id tout le temps SAUF pour le livre qui a effectivement le prix minimum dans l'absolu.

    quelqu'un pourrait il m'aider à me dépatouiller?

    Merci beaucoup

  2. #2
    Membre éprouvé Avatar de bbl22
    Inscrit en
    Février 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 114
    Par défaut
    Essaie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT L.id , L.titre , MIN(p.prix) as prix_min , f.nom
    FROM livre L
    LEFT JOIN prix p 
    ON p.id = L.id_prix
    LEFT JOIN fournisseur f
    ON p.fournisseur_id = f.id
     
    GROUP BY L.id , L.titre , f.nom

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 13
    Par défaut
    "L.id_prix" n'existe pas dans mon modele. (et je ne veux surtout pas qu'il existe, dans le concept, un livre ne doit pas avoir de prix. C'est le prix qui n'a pas de sens sans l'article. donc c'est le prix qui doit avoir un livre_id et pas le contraire si?)

    et surtout j'ai besoin de renseignements de la même table. en fait ce que je veux c'est retrouver le fournisseur_id (ou un autre champ, n'importe lequel comme p.devise par exemple)

    la table fournisseur m'importe peu à vrai dire.

    En fait je veux joindre la table "prix" à ma table "livre" uniquement avec les enregistrements de prix mini.

    autrement dit passer de ca :

    T1, COND De JOINT , T2

    L1, P1.livre_id = L1.id, P1.id, P1.prix, P1.devise , P1.fournisseur_id
    L1, P2.livre_id = L1.id, P2.id, P2.prix, P2.devise , P2.fournisseur_id
    L1, P3.livre_id = L1.id, P3.id, P3.prix, P3.devise , P3.fournisseur_id

    L2, P4.livre_id = L2.id, P4.id, P4.prix, P4.devise , P4.fournisseur_id
    L2, P5.livre_id = L2.id, P5.id, P5.prix, P5.devise , P5.fournisseur_id
    L2, P6.livre_id = L2.id, P6.id, P6.prix, P6.devise , P6.fournisseur_id

    L3, P7.livre_id = L3.id, P7.id, P7.prix, P4.devise , P7.fournisseur_id
    L3, P8.livre_id = L3.id, P8.id, P8.prix, P5.devise , P8.fournisseur_id

    L4, P9.livre_id = L4.id, P9.id, P9.prix, P6.devise , P9.fournisseur_id

    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM livre L LEFT JOIN prix P on P.livre_id=L.id
    à ca :

    T1 COND De JOINT T2

    L1, P2.livre_id = L1.id, P2.id, P2.prix, P2.devise , P2.fournisseur_id (parce que P2 est le minimum entre P1 P2 et P3)

    L2, P6.livre_id = L2.id, P6.id, P6.prix, P6.devise , P6.fournisseur_id (parce que P6 est le minimum entre P4 P5 et P6)

    L3, P8.livre_id = L3.id, P8.id, P8.prix, P5.devise , P8.fournisseur_id (parce que P8 est le minimum entre P7 et P8)

    L4, P9.livre_id = L4.id, P9.id, P9.prix, P6.devise , P9.fournisseur_id (parce que P9 est tout seul donc minimum)

    j'espère être le plus clair possible mais ca n'est jamais évident d'expliquer le problème...

    Merci

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 13
    Par défaut
    ok probleme résolu !

    en fait ma première requête était bonne mais je ne sais pas pourquoi mes données chargées automatiquement (symfony) ne sont pas prises en compte...

    d'ailleurs si quelqu'un savait pourquoi ... en attendant, problème résolu !!

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

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