Bonjour,
Voilà, je me retrouve face à une requête trop complexe pour moi, j'ai besoin d'aide
Contexte :
Il s'agit d'une table qui liste des mails envoyés concernant un article. Elle contient un identifiant unique (de type entier auto-incrémenté), l'identifiant de l'article, l'adresse email du destinataire, un sujet, un corps, une date d'envoi. Cette table est liée à 3 autres tables qui permettent de savoir si le mail est en cours d'envoi, envoyé ou envoi échoué (tables MAILS_EN_COURS, MAILS_OK et MAILS_KO
Je veux afficher un résumé par article, avec le nombre de destinataires total, le nombre de mails envoyés, le nombre en cours d'envoi et le nombre en échec.
Jusque là, pas de problème. Cependant, ma seconde table concernant l'état des mails doit être vidée régulièrement. Je perd alors l'état des mails. Je veux donc mettre à jour un champ ENVOI dans ma première table lors de la purge de la table 2 mettre a NULL le champ IDMAIL de la table 1 qui fait référence à la table 2
Problème :
Comment récupérer dans une seule requête les données issues des tables A + B et les données issues uniquement de la table A ?
Code :
Je veux donc retrouver quelque chose comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 TABLE 1 : MAILS_ENVOIS ------------------------ ID | ID_ARTICLE | DESTINATAIRE | ENVOI | IDMAIL ------------------------------------------------- 1 | 1 | tada1@tutu.com | NULL | 1 2 | 1 | tudu1@tada.com | NULL | 2 3 | 1 | tudu2@tada.com | NULL | 3 4 | 1 | tudu3@tada.com | NULL | 4 5 | 2 | toto1@tudu.com | NULL | NULL -- En cours d'envoi 6 | 2 | toto2@tudu.com | 0 | NULL -- Echec 7 | 2 | toto3@tudu.com | 1 | NULL -- Envoyé TABLE 2 : MAILS_ENCOURS -------------------------- ID -- 1 TABLE 3 : MAILS_OK -------------------- ID -- 2 3 TABLE 4 : MAILS_KO -------------------- ID -- 4
J'ai bien la requête pour les données présentent dans les tables 1 et 2 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 ID_ARTICLE | NB_DESTINATAIRES | NB_OK | NB_EN_COURS | NB_KO ----------------------------------------------------------------- 1 | 4 | 2 | 1 | 1 2 | 3 | 1 | 1 | 1
Je voudrais savoir comment modifier cette requête pour qu'elle prenne en compte les cas ou IDMAIL est NULL et que l'état des mails ne se trouve plus via une jointure mais via le champ ENVOI (NULL = en cours, 1 = envoyé et 0 = échec) (Dans ce cas, IDMAIL est NULL).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 SELECT MAILS_ENVOIS.ID_ARTICLE, COUNT(*) AS NB_DESTINATAIRES, COUNT(M1.ID) AS NB_OK, COUNT(M2.ID) AS NB_EN_COURS, COUNT(M3.ID) AS NB_KO, FROM dbo.MAILS_ENVOIS LEFT JOIN MAILS_EN_COURS M1 ON M1.ID = MAILS_ENVOIS.IDMAIL LEFT JOIN MAILS_OK M2 ON M2.ID = MAILS_ENVOIS.IDMAIL LEFT JOIN MAILS_KO M3 ON M3.ID = MAILS_ENVOIS.IDMAIL WHERE MAILS_ENVOIS.IDMAIL IS NOT NULL GROUP BY MAILS_ENVOIS.ID_ARTICLE
Merci de votre aide
Partager