[SQL] requete, "afficher quand meme"

pour simplifier, j’ai 2 tables: une qui contient du materiel et une autre qui contient du personnel.

il y a une relation entre les 2, un materiel est associé à une personne.

je dois afficher par exemple tout les graveurs, je fais donc:

select m.nom_matos,p.nom from materiel m, personnel p
where m.nom_matos = ‘graveur’
and m.id_pers = p.id_pers

le truc c’est que j’ai du materiel qui n’est pas encore attribué à quelqu’un, j’aimerai don qu’il m’affiche tout les graveurs et que s’il n’y a pas de personne associée à ce matos, bah il l’affiche quand meme.

en gros la condition “m.id_pers = p.id_pers” faudrait qu’elle soit optionnelle, si elle est valide je récupère le nom, si elle ne l’est pas , le champ p.nom serait alors vide mais on aurait quand meme le tuple.

me suis-je bien fait comprendre, moi meme g du mal [:matleflou]

ps: j’ai essayé en 2 requetes, j’ai des infos qui se recoupent et le serveur se prend une charge monstrueuse

[cpp]
select m.nom_matos,p.nom from materiel m, personnel p
where m.nom_matos = ‘graveur’
and (m.id_pers = p.id_pers OR m.id_pers = ‘’)
[/cpp]

J’ai mis champ vide, mais je ne connais pas la valeur par défaut ^^

en simplifiant l’énoncé, le probleme n’est pas aussi simple, car je n’ai pas que 2 tables, j’en ai 5.
Il va y avoir du gros parenthesage !!!

merci, je vais tenter quelquechose :jap:

Perdu, avec ça, tu vas avoir un produit cartésien : chacun des graveurs non associé sera associé à l’ensemble des utilisateurs

C’est une jointure externe qu’il faut faire… Sous Oracle :


select m.nom_matos,p.nom from materiel m, personnel p  
         where m.nom_matos = 'graveur'
         and m.id_pers = p.id_pers(+)

Si tu as une autre base… Va falloir adapter

index bien tes tables, ça fera diminuer la charge. Mais indexe les bien sinon ça risque de faire le contraire mdr

Ah ben [myself] m’a grillé sur le coup :smiley:
C’est en effet une jointure externe qu’il faut faire (OUTER JOIN).

Valoche

j’ai tenté autre chose qu’une jointure externe, bilan: j’ai vautré la machine, 10 minutes à attendre pour qu’elle s’éteigne afin de ne pas perdre les données et j’ai fini sur un écran bleu [:matleflou]

j’utilise mysql 4.0.24, je vais peut etre devoir l’upgrader pour pouvoir faire des jointure externe ?
je vais relire mes docs sur les jointures ce soir…

:jap:

Hum…

[cpp]SELECT m.nom_matos, p.nom
FROM materiel m
LEFT JOIN personnel p ON m.id_pers = p.id_pers
WHERE m.nom_matos = ‘graveur’[/cpp]

Car en gros, ce que tu veux c’est ça :

graveur X -> un graveur à X
graveur Y -> un graveur à Y
graveur NULL -> un graveur à personne

?

[edit] c’est quoi un OUTER JOIN exactement?

en gros c’est ça, sauf que j’ai 2 cas (le materiel est à personne et n’est donc pas dans un service) et qu’il y a des tables intermediares pour récupérer le nom de la presonne et le service.

mais je vais l’adapter, merci :jap:

Et c’est quoi l’OUTER JOIN ?

je pense que c’est plus un terme qu’une commande, en traduisant de la langue de shakespear’s on obtient en gros jointure externe [:austindangerpowers]

Pour ceux qui connaise pas les jointures :

http://sql.developpez.com/sqlaz/jointures/

la jointure externe me donne entiere satisfaction, merci à tous pour votre aide

:jap:

Vi, mais ce que je voudrais savoir c’est quoi la différence:) stout !

En gros:

[cpp]SELECT *
FROM a
LEFT JOIN b ON a.id = b.id

<=> ???

SELECT *
FROM a
LEFT OUTER JOIN b ON a.id = b.id

<=> ???

SELECT *
FROM a
OUTER JOIN b ON a.id = b.id[/cpp]

le “left outer join” et le “left join” produisent le meme resultat chez moi

le “outer join” donne une erreur de syntaxe

Oki :slight_smile: ça doit être la même chose, sauf que mySQL autorise sans le OUTER :slight_smile:

“…and the word OUTER may be added after the word LEFT or RIGHT in the last two examples - it’s provided for ODBC compatability and doesn’t add an extra capabilities…”

Le mot-clé “OUTER” n’est là que assurer la compatibilité avec ODBC :jap:

Donc pour MySQL, un “LEFT JOIN” ou un “RIGHT JOIN”, c’est une jointure externe.

Valoche