MySQL, jointures multiples, WHERE et psychiatrie

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par milkiway, 27 Juillet 2010.

  1. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Bonjour,

    Je deviens complètement fou sur une requête MySQL. :(

    Code:
    SELECT *
    FROM fiches
    LEFT JOIN declinaisons ON fiches.iddeclinaison = declinaisons.id
    LEFT JOIN carrosseries ON declinaisons.variante = carrosseries.id
    LEFT JOIN marques ON fiches.idmarque = marques.id
    LEFT JOIN modeles ON fiches.idmodele = modeles.id
    LEFT JOIN segments ON modeles.segment = segments.id
    Cette requête me renvoie toutes les infos dont j'ai besoin et fonctionne parfaitement.

    Mais dès que j'ajoute un WHERE, certains enregistrements sautent ou ne concordent plus 8O
    Comment est-ce possible ? A quoi faut il faire attention lors de l'ajout de critères WHERE sur une table avec multiples jointures ?
    Le fait que toutes les tables n'aient pas le même nombre de ligne est il en cause ?
    Merci
     
  2. Anto1982
    Anto1982 WRInaute passionné
    Inscrit:
    7 Mai 2009
    Messages:
    1 113
    J'aime reçus:
    0
    As tu des exemples..?

    Je ne crois pas... montre voir a quoi ressemble ta requête avec les conditions WHERE?

    non
     
  3. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Voici un exemple avec WHERE
    Code:
    SELECT *
    FROM fiches
    LEFT JOIN declinaisons ON fiches.iddeclinaison = declinaisons.id
    LEFT JOIN carrosseries ON declinaisons.variante = carrosseries.id
    LEFT JOIN marques ON fiches.idmarque = marques.id
    LEFT JOIN modeles ON fiches.idmodele = modeles.id
    LEFT JOIN segments ON modeles.segment = segments.id
    WHERE modeles.path_modele = 'clio'
    AND declinaisons.path_motorisation = '1l5-dci'
    Sans le WHERE,les valeurs renvoyées pour les données de la table "declinaisons" sont correctes. Avec un clause WHERE, elle ne sont pas cohérentes ou vides. 8O
     
  4. UsagiYojimbo
    UsagiYojimbo WRInaute accro
    Inscrit:
    23 Novembre 2005
    Messages:
    12 011
    J'aime reçus:
    133
    Et si tu fais une simple requête (sans jointure) dans ta table déclinaisons avec un WHERE declinaisons.path_motorisation = '1l5-dci' tu as des données qui te semblent correctes ?
     
  5. Anto1982
    Anto1982 WRInaute passionné
    Inscrit:
    7 Mai 2009
    Messages:
    1 113
    J'aime reçus:
    0
    Je crois qu'il y a un problème dans ta syntaxe... essayes ça:
     
  6. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Oui, parfaitement correct.

    Anto1982 merci ça ne change rien.

    Dès que je met une clause where, quelle que soit la table visée, tout ce qui correspond à "declinaisons" part en vrille 8O
     
  7. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 579
    J'aime reçus:
    0
    Ca aiderait avec un exemple des données et des résultats obtenus... Je pense que le problème doit être lié à l'utilisation de LEFT JOIN (plutôt que JOIN), mais comme ça, là, je ne vois pas de raison particulière que ça cloche. Tu as effectivement des fiches qui n'ont pas de declinaison/marque/modele correspondants (et pareil declinaison->carrosserie et modele->segment)? Si ce n'est pas le cas, tu n'as pas besoin du LEFT...

    Jacques.
     
  8. DadouDuck
    DadouDuck WRInaute impliqué
    Inscrit:
    28 Mai 2007
    Messages:
    812
    J'aime reçus:
    0
    Et ça :

    Code:
    SELECT *
    FROM fiches
    LEFT JOIN declinaisons ON fiches.iddeclinaison = declinaisons.id AND declinaisons.path_motorisation = '1l5-dci'
    LEFT JOIN carrosseries ON declinaisons.variante = carrosseries.id
    LEFT JOIN marques ON fiches.idmarque = marques.id
    LEFT JOIN modeles ON fiches.idmodele = modeles.id AND modeles.path_modele = 'clio'
    LEFT JOIN segments ON modeles.segment = segments.id
    
     
  9. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Bonjour Jacques, merci tu as parfaitement raison, question d'habitude, j'en avais oublié l'existence du JOIN seul.
    Sans les LEFT ça ne change rien. J crois plutôt qu'il doit y avoir un problème dans une des règles de jointures.
    DadouDuck, merci mais ça n'a rien changé... mais j'apprends qu'on peut mettre des critères en plus dans le ON merci !

    Malheureusement, donner des exemples de données risque d'être bien compliqué.
     
  10. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 579
    J'aime reçus:
    0
    Rien qu'un exemple d'une ligne de données qui ne correspond pas à ce que tu veux pourrait probablement aider.

    Jacques.
     
  11. Anto1982
    Anto1982 WRInaute passionné
    Inscrit:
    7 Mai 2009
    Messages:
    1 113
    J'aime reçus:
    0
    "Jack" is back :mrgreen:
     
  12. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Merci à vous tous, c'est super sympa. Je suis toujours planté mais moins seul!
     
  13. Anto1982
    Anto1982 WRInaute passionné
    Inscrit:
    7 Mai 2009
    Messages:
    1 113
    J'aime reçus:
    0
    Est-ce que tu pourrais donner un jeu de données (genre: 3 lignes de chaques tables avec au moin un jeu de données qui ne ofnctionne pas dans la requete avec le WHERE)?
     
  14. jamalofski
    jamalofski WRInaute discret
    Inscrit:
    3 Mars 2007
    Messages:
    225
    J'aime reçus:
    0
    Dès que t'as commencé à parler des jointures externes avec des where, j'ai compris que t'es tombé sur une erreur très courante sur SQL : Mettre les conditions sur les tables secondaires.

    En effet, ce n'est pas la faute ni de SQL ni de MySQL mais de compréhension de ton propre besoin. Quand tu fais une jointure externe tab1 left join tab2, tu dis que tu souhaites afficher les données de tab1 en entier, complétée si possible par les données de tab2.

    Quand tu ajoutes une conditions sur tab2, ca ne change rien pour le nombre de lignes. Il affiche toujours toute la tab1 et il termine par les données de tab2 qui répondent à la condition.

    Si tu ne veux afficher que les lignes avec les données qui correspondent à ta condition alors tu remplaces "LEFT JOIN" par "INER JOIN". Sinon tu parts sur une requêtes imbriquées avec des NOT NULL.
     
  15. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Merci jamalofski mais j'ai remplacé la requête postée plus haut par des INNER JOIN et ai lancé sans aucun WHERE j'ai très peu de résultat (13 sur 137). Si j'ajoute un WHERE quel qu'il soit, je n'ai plus aucune données renvoyée
     
  16. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 579
    J'aime reçus:
    0
    Ca, ça dépend d'où tu mets la condition. C'est vrai si tu mets la condition dans le ON, pas dans le WHERE.

    Jacques.
     
  17. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    J'ai créé un compte "invité" avec une vingtaine de lignes (échantillon), vous pouvez me MP pour l'accés ;)

    Merci à vous.
     
  18. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 579
    J'aime reçus:
    0
    Comme expliqué par MP, c'est parce que tu as beaucoup d'associations invalides (des "fiches" qui font référence à des "declinaisons" qui n'existent pas, etc.). Un JOIN ne renvoie que les lignes pour lesquelles il peut faire toutes les associations. Un LEFT JOIN renvoie toutes les lignes, mais laisse des NULLs là où il ne trouve rien dans les tables "secondaires".

    Exemple:
    Code:
    tablea:
    id | idb
    ---+----
    1  | 0
    2  | 1
    
    tableb:
    id | desc
    ---+-----
    1  | toto
    
    select * from tablea join tableb on (tablea.idb=tableb.id)
    id | idb | id | desc
    ---+-----+----+-----
    2  | 1   | 1  | toto
    
    select * from tablea LEFT join tableb on (tablea.idb=tableb.id)
    id | idb | id | desc
    ---+-----+----+-----
    1  | 0   |    |
    2  | 1   | 1  | toto
    
    (les valeurs de id et desc sur la première ligne sont null)
    
    Jacques.
     
  19. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Encore merci Jacques mais comme répondu, j'ai pour ma part bien les associations.
     
  20. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Je tiens à remercier toutes les personnes qui sont intervenues sur ce topic pour leur aide. Tous les messages de réponse ont apportés soit une pierre à l'édifice, soit des connaissances que je n'avais pas et ou qui serviront à d'autres.
    Je remercie tout particulièrement Anto1982 qui m'a proposé son aide en privé (merci plus besoin, voir la suite) et chaleureusement jcaron pour son aide en privé sur la base (directement dans phpmyadmin) et qui a mis le doigt sur le seul problème depuis le début : ce sont mes données qui sont fausses.
    L'erreur vient tout simplement de mon script PHp de conversion de mes données excel en multiples tables SQL, une des valeur de jointure n'était pas affectée correctement.

    Maintenant que ces données sont corrigées, tout fonctionne à la perfection.

    Vous m'avez tiré une sacré épine du pied, j'en été allé jusqu'à passer 2 jours dessus et imprimer et placarder sur le mur mes tables sans voir le plus évident.................

    Merci :'(
     
Chargement...
Similar Threads - MySQL jointures multiples Forum Date
Mysql : Impact convertion champ numérique SMALLINT vers BIGINT Développement d'un site Web ou d'une appli mobile 23 Août 2021
Quel SGBDR autre que MySQL/MariaDB ? Administration d'un site Web 12 Janvier 2021
encodage texte sur requete mysql Demandes d'avis et de conseils sur vos sites 21 Octobre 2020
Requête MySql imbriquée Développement d'un site Web ou d'une appli mobile 8 Octobre 2020
Supprimer les doublons d'une table mysql Développement d'un site Web ou d'une appli mobile 16 Juin 2020
Mysql migration utf8->utf8mb4 Développement d'un site Web ou d'une appli mobile 17 Août 2019
recherche lettres dans mysql Développement d'un site Web ou d'une appli mobile 11 Juillet 2019
cache mysql maison Développement d'un site Web ou d'une appli mobile 18 Février 2019
Stocker dans des variables php les fonctions MySql Développement d'un site Web ou d'une appli mobile 2 Février 2019
message : [LEGACY][libmysqlclient] Please consider moving to stable and mysqlnd in Administration d'un site Web 8 Novembre 2018
Connexion à un serveur mysql distant Développement d'un site Web ou d'une appli mobile 21 Octobre 2018
Mysql, modifier des chaines avec différents caractères Administration d'un site Web 13 Septembre 2018
Fusionner deux champs sur la même table et même base de donnée Mysql Administration d'un site Web 12 Septembre 2018
Requête Mysql avec des string Développement d'un site Web ou d'une appli mobile 6 Février 2018
Surveiller les connexions à la base de données MySQL Développement d'un site Web ou d'une appli mobile 1 Février 2018
PHP : script pour mettre catalogue xml clickbank dans mysql Développement d'un site Web ou d'une appli mobile 6 Décembre 2017
Mise à jour MySql 5.1 vers 5.5 Administration d'un site Web 1 Juillet 2017
Problème avec un changement de version Mysql de 5.5 à 5.7 Développement d'un site Web ou d'une appli mobile 9 Juin 2017
Requete mysql Développement d'un site Web ou d'une appli mobile 30 Mai 2017
Problème requête mysql Développement d'un site Web ou d'une appli mobile 1 Mars 2017