Récupérer soit un champ dans une table soit un champ dans une autre

Récupérer soit un champ dans une table soit un champ dans une autre - SQL/NoSQL - Programmation

Marsh Posté le 20-01-2009 à 15:48:28    

Hello :o
J'ai un problème un peu compliqué à expliquer :o
 
J'ai 3 tables : entreprise, agence, contact.
Je veux faire un emailing à un certain groupe de personnes dans ces tables.
 
Les tables sont comme ça (en gros) :
 

Citation :

entreprise :
- id
- raisonsociale
- mail
- autres infos
 
agence :
- id
- id_entreprise
- adresse et autres infos
 
contact :
- id
- id_agence
- nom
- prénom
- mail
- autres infos


 
Je veux :
- les adresses mail et infos (nom, prénom et autres) des contacts
- la raison sociale (et d'autres infos) de l'entreprise à laquelle ils sont rattachés
et le point important qui pose problème :
- pour les entreprises qui n'ont pas de contact avec un email (ou pour toutes, je m'en fous) : récupérer l'email général de l'entreprise et "l'assigner" au premier contact qui tombe sous la main.
 
Exemple :

Citation :

Entreprise Albert & fils (email contact@alberts.com), avec les contacts Albert (albert@alberts.com), Alphonse (pas de mail), et Arnaud (arnaud@alberts.com).
Entreprise Barnabé vous veut du bien (email info@barnabe.com), avec les contacts Barnabé, Bertrand et Brutus, qui n'ont pas de mail.
 
Il faudrait que ça me ressorte :
 
id contact | id entreprise | nom | raison sociale | email
1 | 1 | albert | Albert & fils | albert@alberts.com
3 | 1 | arnaud | Albert & fils | arnaud@alberts.com
4 | 2 | barnabé | barnabé vous veut du bien | info@barnabe.com
 
pas plus, pas moins :o


 
 
Mon patron, toujours adepte de, hum, "solutions" "élégantes" et "qui marchent" (j'insiste sur les guillemets à chaque fois), m'a pondu ça :
 

Code :
  1. SELECT contacts.mail AS contact_mail, contacts.typemail, contacts.raisonsociale AS entr_raisonsociale, contacts.entr_id,
  2. contacts.civilite AS civilite_label, contacts.nom AS contact_nom, contacts.prenom AS contact_prenom, contacts.contact_id
  3. FROM (SELECT DISTINCT ctentr.entr_mail AS mail,
  4.   'entr' AS typemail, ctentr.entr_raisonsociale AS raisonsociale, ctentr.entr_id,
  5.   '' AS civilite, '' AS nom, '' AS prenom, 0 AS contact_id
  6. FROM e_activite
  7. INNER JOIN e_famille ON e_activite.famille_id = e_famille.famille_id
  8. INNER JOIN e_entreprise_activite ON e_activite.activite_id = e_entreprise_activite.activite_id
  9. INNER JOIN VContacts AS ctentr ON e_entreprise_activite.entr_id = ctentr.entr_id
  10. WHERE (ctentr.entr_valide = 1) AND (ctentr.contact_valide = 1)
  11.   AND (NOT (ctentr.entr_mail IS NULL)) AND (NOT (ctentr.entr_mail LIKE ''))
  12. UNION
  13. SELECT DISTINCT ctcont.contact_mail AS mail, 'contact' AS typemail,
  14.   ctcont.entr_raisonsociale AS raisonsociale, ctcont.entr_id,
  15.   ctcont.civilite_label AS civilite, ctcont.contact_nom AS nom,
  16.   ctcont.contact_prenom AS prenom, ctcont.contact_id
  17. FROM e_activite AS actcont
  18. INNER JOIN e_famille AS famillecont ON actcont.famille_id = famillecont.famille_id
  19. INNER JOIN e_entreprise_activite AS entractcont ON actcont.activite_id = entractcont.activite_id
  20. INNER JOIN VContacts AS ctcont ON entractcont.entr_id = ctcont.entr_id
  21. WHERE (ctcont.entr_valide = 1) AND (ctcont.contact_valide = 1)
  22.   AND (NOT (ctcont.contact_mail IS NULL)) AND (NOT (ctcont.contact_mail LIKE ''))
  23. ) AS contacts


 
Donc pas du tout ce qu'ils nous faudrait, puisque ça nous sort :
- tous les contacts qui ont un mail
- plus toutes les entreprises qui ont un mail, avec des infos bidons pour le contact
 
et en plus c'est moche :o
 
 
est-ce que vous avez une idée ? [:dawao]


---------------
Android/Manettes/Metroidvania/Zelda/Indés/Retrogaming/VDS jeux
Reply

Marsh Posté le 20-01-2009 à 15:48:28   

Reply

Marsh Posté le 20-01-2009 à 20:16:05    

Salut,
 
J'ai un peu de mal à comprendre la structure... La table Agence, elle sert à quoi concrètement (à moins que id soit en fait Id_Contact, ce qui n'a pas l'air d'être le cas vu la structure des autres tables...). Je t'avoue que je n'ai pas pris le temps d'essayer de comprendre la requête de ton "patron" (je me permets des guillemets aussi...)...
 
Pourrais-tu expliquer un peu plus la relation entre CONTACT, AGENCE et ENTREPRISE ?
 
Il faudrait ensuite que tu me dise comment tu comptes détecter qu'une personne n'a pas d'email, à savoir : champ vide, valeur Null, champ contenant des données mais pas au format email valide (et dans ce cas les critères (par défaut je ferai ISNULL(Email, '') NOT LIKE '%@%.%'))
 
Une fois ces premières réponses apportées, je pense qu'on y verra un peu plus clair (en tout cas pour moi...)
 
Après, par rapport à ton exemple, ça se résume en gros à :
 
Si au moins un client lié à une entreprise (par le moyen que tu vas me donner en répondant aux questions) a un email, on récupère leurs emails et toutes les autres personnes liées à cette entreprise mais n'ayant pas d'email sont éliminées, par contre si personne dans une entreprise ne possède d'email, on affecte à la première personne qui nous tombe sous la main l'email de l'entreprise et on élimine toutes les autres personnes...
 
Ca me paraît un peu "bizarre" comme façon de gérer une campagne d'emailing, mais techniquement tout est possible... Si j'étais à ta place, j'essaierai quand même de valider clairement la règle de gestion (ne serait-ce que pour la perso de l'email et le nombre de personnes que tu vas éliminer).
 
Bon courage,

Reply

Marsh Posté le 20-01-2009 à 20:54:49    

Tibar a écrit :

Pourrais-tu expliquer un peu plus la relation entre CONTACT, AGENCE et ENTREPRISE ?


ben, une entreprise a plusieurs agences, qui ont chacune plusieurs contacts :o

 

Par exemple, pour l'entreprise kiloutou, y'a l'agence rue machin, boulevard truc et avenue bidule. Dans l'agence rue machin, y'a les contacts A et B. Dans l'agence boulevard truc, y'a les contacts C et D. Etc.

 
Tibar a écrit :

Il faudrait ensuite que tu me dise comment tu comptes détecter qu'une personne n'a pas d'email, à savoir : champ vide, valeur Null, champ contenant des données mais pas au format email valide (et dans ce cas les critères (par défaut je ferai ISNULL(Email, '') NOT LIKE '%@%.%'))


Code :
  1. WHERE (NOT (email IS NULL OR email LIKE '')) #AND autres critères
 
Tibar a écrit :

Si au moins un client lié à une entreprise (par le moyen que tu vas me donner en répondant aux questions) a un email, on récupère leurs emails et toutes les autres personnes liées à cette entreprise mais n'ayant pas d'email sont éliminées, par contre si personne dans une entreprise ne possède d'email, on affecte à la première personne qui nous tombe sous la main l'email de l'entreprise et on élimine toutes les autres personnes...


c'est ça :jap:

 
Tibar a écrit :

Ca me paraît un peu "bizarre" comme façon de gérer une campagne d'emailing, mais techniquement tout est possible...


c'est parce que la commerciale s'est plantée et elle a renseigné de temps en temps dans le champ entreprise, et de temps en temps dans le champ contact :o

 
Tibar a écrit :

Si j'étais à ta place, j'essaierai quand même de valider clairement la règle de gestion (ne serait-ce que pour la perso de l'email et le nombre de personnes que tu vas éliminer).


La personne de l'email on s'en fout, on n'a que des noms, ce sont des prospects, la plupart du temps on a leur nom mais on ne sait pas ce qu'ils font. On prend la première et basta.
Pour les personnes que "j'élimine", de toute façon on n'a pas leurs mails, donc ça change pas grand-chose :o


Message édité par cosmoschtroumpf le 20-01-2009 à 20:55:19

---------------
Android/Manettes/Metroidvania/Zelda/Indés/Retrogaming/VDS jeux
Reply

Marsh Posté le 21-01-2009 à 10:39:31    

Ok, je ne sais pas si ça va être faisable en une seule requête, si tu fais ça :  
 
SELECT  
 CONTACT.Nom,  
 CONTACT.Prenom,  
 CASE CONTACT.Mail  
  WHEN Null THEN ENTREPRISE.Mail
  WHEN '' THEN ENTREPRISE.Mail
  WHEN <Autres critères> THEN ENTREPRISE.Mail
  ELSE CONTACT.Mail
 END,
 ENTREPRISE.RaisonSociale
FROM CONTACT
INNER JOIN AGENCE ON AGENCE.Id = CONTACT.Id_Agence
INNER JOIN ENTREPRISE ON ENTREPRISE.Id = AGENCE.Id_Entreprise
 
ça te retourne pour chaque contact, soit son email propre si il en a un, soit l'email de l'entreprise à laquelle il est rattaché, mais on l'a autant de fois qu'il y a de contacts, c'est ta règle "au premier contact qu'on trouve" qui risque de poser problème, mais c'est une première piste, après avec un DISTINCT sur l'email dans cette requête, tu peux ne récupérer que les lignes qui ont des emails différents, donc à fortiori une seule fois l'email de l'entreprise et tous les autres emails différents...
 

Reply

Marsh Posté le 21-01-2009 à 13:13:14    

Tibar a écrit :

Ok, je ne sais pas si ça va être faisable en une seule requête, si tu fais ça :  
 
SELECT  
 CONTACT.Nom,  
 CONTACT.Prenom,  
 CASE CONTACT.Mail  
  WHEN Null THEN ENTREPRISE.Mail
  WHEN '' THEN ENTREPRISE.Mail
  WHEN <Autres critères> THEN ENTREPRISE.Mail
  ELSE CONTACT.Mail
 END,
 ENTREPRISE.RaisonSociale
FROM CONTACT
INNER JOIN AGENCE ON AGENCE.Id = CONTACT.Id_Agence
INNER JOIN ENTREPRISE ON ENTREPRISE.Id = AGENCE.Id_Entreprise
 
ça te retourne pour chaque contact, soit son email propre si il en a un, soit l'email de l'entreprise à laquelle il est rattaché, mais on l'a autant de fois qu'il y a de contacts, c'est ta règle "au premier contact qu'on trouve" qui risque de poser problème, mais c'est une première piste, après avec un DISTINCT sur l'email dans cette requête, tu peux ne récupérer que les lignes qui ont des emails différents, donc à fortiori une seule fois l'email de l'entreprise et tous les autres emails différents...


non mais merci ça j'avais déjà trouvé tout seul :D
mais justement, pour les entreprises pour lesquelles il y a un mail mais dont les contacts n'ont pas de mail, ça ressort autant de lignes que de contacts.
et tu peux pas faire de distinct juste sur un champ.


---------------
Android/Manettes/Metroidvania/Zelda/Indés/Retrogaming/VDS jeux
Reply

Sujets relatifs:

Leave a Replay

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