MySQL, jointures multiples, WHERE et psychiatrie


milkiway
WRInaute accro
WRInaute accro
 
Messages: 4910
Inscription: 3 Fév 2004

MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 10:32

Bonjour,

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

Code: Tout sélectionner
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


Anto1982
WRInaute passionné
WRInaute passionné
 
Messages: 1334
Inscription: 7 Mai 2009

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 10:45

Mais dès que j'ajoute un WHERE, certains enregistrements sautent ou ne concordent plus

As tu des exemples..?

Comment est-ce possible ? A quoi faut il faire attention lors de l'ajout de critères WHERE sur une table avec multiples jointures ?

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

Le fait que toutes les tables n'aient pas le même nombre de ligne est il en cause ?
non


milkiway
WRInaute accro
WRInaute accro
 
Messages: 4910
Inscription: 3 Fév 2004

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 10:56

Voici un exemple avec WHERE
Code: Tout sélectionner
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


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8575
Inscription: 23 Nov 2005

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 11:00

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 ?


Anto1982
WRInaute passionné
WRInaute passionné
 
Messages: 1334
Inscription: 7 Mai 2009

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 11:04

Je crois qu'il y a un problème dans ta syntaxe... essayes ça:
SELECT *
FROM fiches
LEFT JOIN declinaisons ON declinaisons.id=fiches.iddeclinaison
LEFT JOIN carrosseries ON carrosseries.id=declinaisons.variante
LEFT JOIN marques ON marques.id=fiches.idmarque
LEFT JOIN modeles ON modeles.id=fiches.idmodele
LEFT JOIN segments ON segments.id=modeles.segment
WHERE modeles.path_modele = 'clio'
AND declinaisons.path_motorisation = '1l5-dci'


milkiway
WRInaute accro
WRInaute accro
 
Messages: 4910
Inscription: 3 Fév 2004

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 11:11

UsagiYojimbo a écrit: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 ?

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

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2685
Inscription: 13 Fév 2004

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 11:46

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.

DadouDuck
WRInaute impliqué
WRInaute impliqué
 
Messages: 910
Inscription: 28 Mai 2007

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 11:46

Et ça :

Code: Tout sélectionner
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


milkiway
WRInaute accro
WRInaute accro
 
Messages: 4910
Inscription: 3 Fév 2004

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 12:23

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é.

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2685
Inscription: 13 Fév 2004

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 12:39

Rien qu'un exemple d'une ligne de données qui ne correspond pas à ce que tu veux pourrait probablement aider.

Jacques.


Anto1982
WRInaute passionné
WRInaute passionné
 
Messages: 1334
Inscription: 7 Mai 2009

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 12:53

"Jack" is back :mrgreen:


milkiway
WRInaute accro
WRInaute accro
 
Messages: 4910
Inscription: 3 Fév 2004

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 12:56

Merci à vous tous, c'est super sympa. Je suis toujours planté mais moins seul!


Anto1982
WRInaute passionné
WRInaute passionné
 
Messages: 1334
Inscription: 7 Mai 2009

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 13:11

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)?

jamalofski
WRInaute discret
WRInaute discret
 
Messages: 219
Inscription: 3 Mar 2007

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 13:35

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.


milkiway
WRInaute accro
WRInaute accro
 
Messages: 4910
Inscription: 3 Fév 2004

Re: MySQL, jointures multiples, WHERE et psychiatrie

Message le Mar Juil 27, 2010 14:05

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

MySQL, jointures multiples, WHERE et psychiatrie

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité