OVH Cloud OVH Cloud

[SQL] requete sur 2 tables liées

2 réponses
Avatar
Paul
Bonjour,
j'ai besoin d'aide pour efectuer une requete SQL.

Voici le contexte :
- j'ai une table "messages" (avec un id_message, un message....)
- j'ai une table "commentaires" (avec un id_commentaire, id_message)

donc les 2 tables sont li=E9es.

Pour obtenir tous les messages ayant un commentaire : =E7a va, je fais
un
SELECT m.*, c.* FROM messages m, commentaire c WHERE
(m.idmessage=3Dc.id_message)

Mais je souhaite maintenant obtenir la liste des messages n'ayant pas
de commentaire : comment je peut faire ?
SELECT m.*, c.* FROM messages m, commentaire c WHERE
(la_table_commentaire_ne_contient_pas_de_ligne avec :
id_message=3Dm.id_message )

Merci beaucoup de votre aide.

2 réponses

Avatar
JustMe
Paul a émis l'idée suivante :
Bonjour,
j'ai besoin d'aide pour efectuer une requete SQL.

Voici le contexte :
- j'ai une table "messages" (avec un id_message, un message....)
- j'ai une table "commentaires" (avec un id_commentaire, id_message)

donc les 2 tables sont liées.

Pour obtenir tous les messages ayant un commentaire : ça va, je fais
un
SELECT m.*, c.* FROM messages m, commentaire c WHERE
(m.idmessage=c.id_message)

Mais je souhaite maintenant obtenir la liste des messages n'ayant pas
de commentaire : comment je peut faire ?
SELECT m.*, c.* FROM messages m, commentaire c WHERE
(la_table_commentaire_ne_contient_pas_de_ligne avec :
id_message=m.id_message )

Merci beaucoup de votre aide.




select * from messages where idmessage not in (select id_message from
commentaire );
Avatar
Bruno Baguette
Paul a écrit :
Bonjour,
j'ai besoin d'aide pour efectuer une requete SQL.

Voici le contexte :
- j'ai une table "messages" (avec un id_message, un message....)
- j'ai une table "commentaires" (avec un id_commentaire, id_message)

donc les 2 tables sont liées.

Pour obtenir tous les messages ayant un commentaire : ça va, je fais
un
SELECT m.*, c.* FROM messages m, commentaire c WHERE
(m.idmessage=c.id_message)



Si je puis me permettre, évitez le *, ca vous évitera bien des problèmes
! Il est préférable d'indiquer les différents champs dont vous avez
besoin, l'un après l'autre. :-)

Mais je souhaite maintenant obtenir la liste des messages n'ayant pas
de commentaire : comment je peut faire ?
SELECT m.*, c.* FROM messages m, commentaire c WHERE
(la_table_commentaire_ne_contient_pas_de_ligne avec :
id_message=m.id_message )



Une jointure externe devrait faire l'affaire :

SELECT messages .*
FROM messages
LEFT JOIN commentaire ON messages.idmessage=commentaire.id_message
WHERE commentaire.id_message IS NULL

Il y a une autre solution, plus élégante (à mon goût) qui peut se faire
avec le prédicat NOT EXISTS :

SELECT messages .*
FROM messages
WHERE NOT EXISTS
(
SELECT *
FROM commentaire
WHERE commentaire.id_message = messages.idmessage
);

Notez ici que le * du SELECT qui se trouve dans le NOT EXISTS n'a pas
d'influence étant donné que l'on ne récupère pas des données avec cette
sous-requête, mais que l'on ne fait que tester l'existence de données ! :-)

Bien à vous,

--
Bruno BAGUETTE -