Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1984 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Besoin d'un fort en jointure externe MySQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Besoin d'un fort en jointure externe MySQL

n°1447945
Peanuty
Posté le 27-09-2006 à 00:16:57  profilanswer
 

Hello,  
voilà, j'ai 3 tables MySQL :
 
ORDERS (commandes)
customers_id
delivery_city
...
 
QUESTIONNAIRES (questionnaires)
questionnaires_id
choix_id
langue
intitule
 
CUSTOMERS_QUESTIONNAIRES (lien entre les commandes et les questionnaires)
customers_id
questionnaires_id
choix_id
 
La requête suivante fonctionne seulement si customers_id est présent dans CUSTOMERS_QUESTIONNAIRES (le client a répondu à un questionnaire lors d'une commande) :

select delivery_city, intitule  
from orders, questionnaires as q, customers_questionnaires as cq  
where orders_id = '24'  
and q.choix_id = cq.choix_id  
and q.questionnaires_id = cq.questionnaires_id  
and q.langue = '1'  
and q.questionnaires_id = '1'
and cq.customers_id = orders.customers_id


Il faut donc une jointure externe pour avoir aussi les commandes des clients qui n'ont pas répondu au questionnaire (donc customers_id absent de customers_questionnaires), mais déjà avec 2 tables j'ai du mal, alors avec 3... Et je dois boucler ça pour mercredi soir.  :(  
 
HELP !


Message édité par Peanuty le 27-09-2006 à 09:49:38
mood
Publicité
Posté le 27-09-2006 à 00:16:57  profilanswer
 

n°1448071
MagicBuzz
Posté le 27-09-2006 à 11:31:19  profilanswer
 

Je dirais un truc du genre :
Je sais jamais si c'est left outer join ou right outer join, tu changeras si c'est pas bon ;)
 


select delivery_city, intitule  
from orders left outer join customers_questionnaires as cq
on cq.customers_id = orders.customers_id
left outer join questionnaires as q
on q.choix = cq.choix
and q.questionnaires_id = cq.questionnaires_id
and q.langue = '1'
and q.questionnaires_id = '1'  
where orders_id = '24'

n°1448463
Peanuty
Posté le 27-09-2006 à 21:45:24  profilanswer
 

EDIT : Apparemment c'est bon !  :jap:  
 
Merci, mais ça marche pô bien.  :cry:  
 
avec left outer join, si customers_id apparaît 2 fois dans orders et 1 seule fois dans customers_questionnaires la requête me retourne 2 lignes identiques, sauf le champ intitule une fois renseigné et une fois NULL !
 
(et avec right outer join ça se comporte comme ma requête d'origine, soit aucun résultat si customers_id n'est pas dans customers_questionnaires)


Message édité par Peanuty le 27-09-2006 à 23:51:25
n°1448474
omega2
Posté le 27-09-2006 à 21:59:03  profilanswer
 

Peanuty > Pour pas dire de coneries, je vais commencer par te poser une simple question qui a pour but de clarifier ce que tu veux :
- si la personne à fait deux achats et qu'il a répondus à deux questionnaires (un par achat) est ce que tu veux les deux intitulés ou un seul (si un seul, lequel?)

n°1448479
Peanuty
Posté le 27-09-2006 à 22:07:27  profilanswer
 

En fait les questionnaires sont dissociés des achats.
Je veux simplement, lorsque je récupère les infos des commandes passées (table ORDERS), récupérer en même temps la réponse au questionnaire 1 (éventuellement NULL si le client n'a pas répondu au questionnaire).
 
Plus précisemment, dans l'exemple, cette requête me retourne les infos de la commande n°24 et en même temps l'éventuelle réponse au questionnaire n°1 (réponse qui a pu être donnée par le client concerné au cours de n'importe quelle commande).

n°1448494
omega2
Posté le 27-09-2006 à 22:35:40  profilanswer
 

Ma question n'est pas anodine. Si tu veux pour chaque client le questionnaire le plus vieux (et uniquement celui là) ou le questionnaire le plus récent (et uniquement celui là) alors il faudra modifier la requette d'une certaine maniére. Si par contre tu veux tous les questionnaires tout en ayant l'achat le plus récent si aucun questionnaire de renseigné alors la modification sera différente.
Tant qu'on ne saura pas précisément ce que tu veux obtenir on ne poura pas t'aider d'avantage.

n°1448498
Peanuty
Posté le 27-09-2006 à 22:43:18  profilanswer
 

J'ai pas dû être clair alors, désolé :
il n'y a pas d'histoire de plus récent ou plus vieux.
Je veux les infos d'une commande précise (en donnant son numéro : 24) et la réponse éventuelle à un questionnaire précis (en donnant son numéro : 1) du client qui a passé cette commande.
(c'est dans les données de la commande que je trouve le numéro du client qui me sert pour retrouver sa réponse au questionnaire)
 
Sinon je pense essayer de séparer en 2 requêtes, ça sera plus simple en fait.

n°1448505
omega2
Posté le 27-09-2006 à 22:55:38  profilanswer
 

Heu, je viens de me demander un truc tout con.
orders_id est il un id unique de commande? Si c'est le cas, comment peux tu avoir deux lignes avec le même id?
J'essaye d'y voir un peu plus clair dans la structure de tes données pour en comprendre les subtilités.

n°1448507
Peanuty
Posté le 27-09-2006 à 23:03:19  profilanswer
 

Oui orders_id est la clé primaire de orders, la référence de la commande.
 
C'est le retour de la requête proposée qui me donne 2 lignes identiques (sauf le champ intitulé).

n°1448515
omega2
Posté le 27-09-2006 à 23:20:05  profilanswer
 

Heu, par hasard, est ce qu'il n'y aurait pas création d'une ligne dans CUSTOMERS_QUESTIONNAIRES dés qu'une vente est effectué?
Si c'est le cas, ca expliquerait pourquoi t'obtient deux ligne sau final dont une avec un "null".

mood
Publicité
Posté le 27-09-2006 à 23:20:05  profilanswer
 

n°1448517
Peanuty
Posté le 27-09-2006 à 23:33:12  profilanswer
 

Non. Aucun lien direct entre une commande et un questionnaire.
C'est juste grâce au numéro de client qui apparaît dans les 2 tables qu'on peut faire un rapprochement.
 
Une commande est mémorisée dans orders.
 
Les questionnaires dans questionnaires.
Et quand un client répond n'importe quand à un questionnaire son choix est mémorisé dans customers_questionnaires.
 
Apparemment (mais je ne sais pas bien pourquoi) si un client a déjà passé 2 commandes (donc 2 lignes dans orders) et qu'il a répondu un jour au questionnaire 1 (donc 1 ligne dans customers_questionnaires), la requête retourne 2 lignes.
1 fois par ligne trouvée dans orders visiblement ?

n°1448521
Peanuty
Posté le 27-09-2006 à 23:46:38  profilanswer
 

Hou pinaise ! Je crois que j'ai trouvé : en fait il y a un bug ailleurs qui insère parfois des valeurs plusieurs fois dans customers_questionnaires.  :whistle:  
Je vérifie, mais je crois que c'est ça...

n°1448523
Peanuty
Posté le 27-09-2006 à 23:52:19  profilanswer
 

Bon, ben ça m'a bien l'air d'être ça. :D  Désolé pour le dérangement et merci pour votre aide.  :jap:  

n°1448536
omega2
Posté le 28-09-2006 à 01:14:33  profilanswer
 

De rien, parfois un oeuil extérieur permet de mettre le doigt dans le bug. ;)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Besoin d'un fort en jointure externe MySQL

 

Sujets relatifs
Se connecter au serveur MysqlProblème MySql
[Debutant][Mysql]copie de champs d'une table à une autre[MySQL] Modifier 1 ou plusieurs caractères dans une bd?
[MYSQL] [RESOLU] avec UNION, comment "créer" un champs ?[PHP/Mysql] Pb avec mysql_fetch_row
[MySQL] UNION spéciale :)Classe simple pour mysql : questions !
[MySQL] Taille de Blob[PHP /Mysql] Internal Server Error dans les parties administration
Plus de sujets relatifs à : Besoin d'un fort en jointure externe MySQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR