Besoin d'un fort en jointure externe MySQL

Besoin d'un fort en jointure externe MySQL - SQL/NoSQL - Programmation

Marsh Posté le 27-09-2006 à 00:16:57    

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
Reply

Marsh Posté le 27-09-2006 à 00:16:57   

Reply

Marsh Posté le 27-09-2006 à 11:31:19    

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'

Reply

Marsh Posté le 27-09-2006 à 21:45:24    

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
Reply

Marsh Posté le 27-09-2006 à 21:59:03    

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

Reply

Marsh Posté le 27-09-2006 à 22:07:27    

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

Reply

Marsh Posté le 27-09-2006 à 22:35:40    

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.

Reply

Marsh Posté le 27-09-2006 à 22:43:18    

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.

Reply

Marsh Posté le 27-09-2006 à 22:55:38    

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.

Reply

Marsh Posté le 27-09-2006 à 23:03:19    

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

Reply

Marsh Posté le 27-09-2006 à 23:20:05    

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

Reply

Marsh Posté le 27-09-2006 à 23:20:05   

Reply

Marsh Posté le 27-09-2006 à 23:33:12    

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 ?

Reply

Marsh Posté le 27-09-2006 à 23:46:38    

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

Reply

Marsh Posté le 27-09-2006 à 23:52:19    

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

Reply

Marsh Posté le 28-09-2006 à 01:14:33    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed