Raaah le SQL... Probleme de jointure

Raaah le SQL... Probleme de jointure - SQL/NoSQL - Programmation

Marsh Posté le 26-05-2005 à 12:29:07    

Salut tout le monde,  
 
Les sql est ma bête noire, j'ai un problème élémentaire que je n'arrive pas à résoudre :
J'ai (en écriture abrégée) :
* une table contenant des mots : keyword (id int, word varchar)
* une table de familles de mots : family (id int, name varchar)
* une table d'assoc entre les 2 : assoc (id_family int, id_keyword int)
 
Je veux pouvoir récuperer un résultat avec toutes les combinaisons (mot , famille) et une valeur (quelconque, je m'en fous NULL/pas NULL) m'indiquant qu'il y a un lien dans la table d'association.
 
Si je fais une jointure :

Code :
  1. select name, f.id, word, w.id from family f left outer join keyword w on 1=1;

(oui je sais le 1=1 est très très con c'est en attendant de trouver la condition apropriée)
J'ai toutes les combinaisons mais sans l'indication de l'association.
 
Si je fais un select sur assoc, j'aurais toutes les associations mais sans faire toutes les combinaisons.
 
Question : comment faire ça une seule requete, je suis sûr que c'est hyper-simple mais plus j'étudie SQL moins je comprends ce langage. Question plus générale : comment on raisonne en SQL ?
 
PS : je suis sous MySQL donc on oublie les requetes imbriquées.
 
Par avance merci


---------------
Friedrich Nietzsche : Le christianisme et l'alcool, les deux plus grands agents de corruption
Reply

Marsh Posté le 26-05-2005 à 12:29:07   

Reply

Marsh Posté le 26-05-2005 à 17:04:39    

Tu commences par extraire toutes les combinaisons "family" - "keyword" possibles, comme tu l'as fait, en joignant les deux tables:
 

Code :
  1. SELECT
  2.   family.name,
  3.   keyword.word
  4. FROM
  5.   family,
  6.   keyword


 
Tu auras donc un résultat contenant (nombre d'enregistrements de "family" ) * (nombre d'enregistrements de "keyword" ).
 
Ensuite, tu ajoutes ta table "assoc", mais tu t'en fous de savoir si oui ou non il y a un résultat dans la table de droite correspondant à la table de gauche. C'est ça un "LEFT JOIN".
Le résultat que tu veux obtenir dépend de l'existence simultanée dans "assoc" de "id_family" ET "id_keyword", donc ta jointure se fera comme ceci:
 

Code :
  1. LEFT JOIN assoc ON assoc.id_family = family.id AND assoc.id_keyword = keyword.id


 
Tu ajoutes donc une colonne, montrant si oui ou non la jointure donne un résultat, faisant un test sur le NULL, qui est la valeur retournée s'il n'y a pas de résultat.
Soit:
 

Code :
  1. IF(ISNULL(assoc.id_family),'no','yes')


 
Ce qui donne, récomposé:
 

Code :
  1. SELECT
  2.   keyword.word,
  3.   family.name,
  4.   IF(ISNULL(assoc.id_keyword),'no','yes') AS link
  5. FROM
  6.   keyword,
  7.   family
  8. LEFT JOIN assoc ON assoc.id_keyword = keyword.id AND assoc.id_family = family.id

Reply

Marsh Posté le 27-05-2005 à 19:01:20    

Merci beaucoup Jeff@be, ton aide m'a été précieuse :jap:
 
Ca marche nickel et j'ai compris comment construire ce type de requete.
 
Merci


---------------
Friedrich Nietzsche : Le christianisme et l'alcool, les deux plus grands agents de corruption
Reply

Sujets relatifs:

Leave a Replay

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