MySQL, jointures multiples, WHERE et psychiatrie
20 messages
• Page 1 sur 2 • 1, 2
-

milkiway - WRInaute accro

- Messages: 4910
- Inscription: 3 Fév 2004
MySQL, jointures multiples, WHERE et psychiatrie
Bonjour,
Je deviens complètement fou sur une requête MySQL.
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
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
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
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é

- Messages: 1334
- Inscription: 7 Mai 2009
Re: MySQL, jointures multiples, WHERE et psychiatrie
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?
nonLe fait que toutes les tables n'aient pas le même nombre de ligne est il en cause ?
-

milkiway - WRInaute accro

- Messages: 4910
- Inscription: 3 Fév 2004
Re: MySQL, jointures multiples, WHERE et psychiatrie
Voici un exemple avec WHERE
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.
- 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.
-

UsagiYojimbo - WRInaute accro

- Messages: 8575
- Inscription: 23 Nov 2005
Re: MySQL, jointures multiples, WHERE et psychiatrie
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é

- Messages: 1334
- Inscription: 7 Mai 2009
Re: MySQL, jointures multiples, WHERE et psychiatrie
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

- Messages: 4910
- Inscription: 3 Fév 2004
Re: MySQL, jointures multiples, WHERE et psychiatrie
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
- jcaron
- WRInaute accro

- Messages: 2685
- Inscription: 13 Fév 2004
Re: MySQL, jointures multiples, WHERE et psychiatrie
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.
Jacques.
- DadouDuck
- WRInaute impliqué

- Messages: 910
- Inscription: 28 Mai 2007
Re: MySQL, jointures multiples, WHERE et psychiatrie
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

- Messages: 4910
- Inscription: 3 Fév 2004
Re: MySQL, jointures multiples, WHERE et psychiatrie
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é.
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é.
- jamalofski
- WRInaute discret

- Messages: 219
- Inscription: 3 Mar 2007
Re: MySQL, jointures multiples, WHERE et psychiatrie
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.
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

- Messages: 4910
- Inscription: 3 Fév 2004
Re: MySQL, jointures multiples, WHERE et psychiatrie
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
20 messages
• Page 1 sur 2 • 1, 2
Lectures recommandées sur ce thème :
- InfoSpace signe un contrat avec Google - 04-09-2002
- Gestion des langues et des sessions en PHP / MySQL - 02-05-2004
- Passage à l'heure d'été/hiver sur un forum phpBB - 31-10-2010
- Script de mise en cache des pages (PHP MySQL) - 09-08-2010
- GoogleStats : analyse temps réel des visites de Google sur votre site - 02-10-2002
- Google AdSense : Nouvelles fonctionnalités - 01-09-2004
- Sortie officielle de GoogleStats v2.0 ! - 23-02-2003
- AdSense Tracking : statistiques détaillées sur les clics AdSense - 29-02-2004
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité
