Sélectionnés tous ceux qui ne sont pas dans la table

Sélectionnés tous ceux qui ne sont pas dans la table - PHP - Programmation

Marsh Posté le 16-05-2011 à 19:25:48    


Bonjour,
 
 
J’aimerais sélectionner toutes les adresses courriel qui ne sont pas dans la table.
Pouvez-vous me dire ce qui ne fonctionne pas dans mon code ?
Le but est de récupérer les adresses courriel des parents avec les Id des garderies qui n’ont pas déjà été avisés (qui ne sont pas dans la table yellow_Alert_sended).
 
Quand l’avis courriel est envoyé, l’envoie est logé dans yellow_alert_sended et on s’y réfère pour ne pas envoyer un autre avis en double lors de la prochaine exécution.
 
Le problème est qu’aussitôt qu’une ligne est trouvée dans la table yellow_alert.sended, le script exit immédiatement sans continuer pour trouver les autres qui ne sont pas dedans.
 
Voici  
 

Code :
  1. //get the info yellow_alert (parents)
  2. $qparaa = "select yellow_alert.email_parents from yellow_alert where AlertID";
  3. $rparaa = mysql_query($qparaa) or die(mysql_error());
  4. $aparaa = mysql_fetch_array($rparaa);
  5. //get the info yellow_Agents_garderies
  6. $qgarderies = "select yellow_agents_garderies.AgentID_garderies from yellow_agents_garderies where AgentID_garderies";
  7. $rgarderies = mysql_query($qgarderies) or die(mysql_error());
  8. $agarderies = mysql_fetch_array($rgarderies);
  9. //get the info yellow_alert_sended
  10. $qsended = "select yellow_alert_sended.fusion from yellow_alert_sended where AlertsendedID";
  11. $rsended = mysql_query($qsended) or die(mysql_error());
  12. $asended = mysql_fetch_array($rsended);
  13. // verifier si le email a deja été envoyer selon la table de log yellow_alert_sended
  14. $qnotsend = "select * from yellow_alert_sended where yellow_alert_sended.fusion != '$aparaa$agarderies' ";
  15. $rnotsend = mysql_query($qnotsend) or die(mysql_error());
  16. if(mysql_num_rows($rnotsend) > '0')
  17. {
  18. echo "exit car le email a déjà été envoyer";
  19. exit();
  20. }
  21. // si non, on continue et on envoie les avis courriels a tous ceux qui ne sont pas dans la table yellow_alert_fusion….
  22. //blabla…
  23. // on log la table yellow_alert_sended..  
  24. //… exit..
  25. J’ai essayé aussi le code suivant avec un NOT IN :
  26. // vérifier les correspondances entre les annonces des garderies et les recherches(alert) des parents enregistrer.
  27. // avec le NOT IN j’essaie d’exclure ceux qui sont déjà dans la table yellow_alert_sended.
  28. $qexpa = "select * from yellow_alert, yellow_agents_garderies where
  29. yellow_alert.statut_Alert = 'active' && yellow_agents_garderies.statut_annonceID = 'active' &&
  30. yellow_alert.CategoryList = yellow_agents_garderies.CategoryID && yellow_alert.Provinces = yellow_agents_garderies.Provinces &&
  31. yellow_alert.state = yellow_agents_garderies.state && '$aparaa[email_parents]$agarderies[AgentID_garderies]' NOT IN (select yellow_alert_sended.fusion from yellow_alert_sended where AlertsendedID)";
  32. $rexpa = mysql_query($qexpa) or die(mysql_error());
  33. if(mysql_num_rows($rexpa) > '0')
  34. {
  35. while($aexp = mysql_fetch_array($rexpa))
  36. {
  37. // on envoie les avis courriels au parents selon les correspondances entre les parents et les garderies sauf tous ceux qui sont dans la table yellow_alert_fusion
  38. // blabla..
  39. //….
  40. }
  41. }
  42. {
  43. echo "exit car le email a deja ete envoyer car il est déjà logé dans la table yellow_alert_sended";
  44. exit();
  45. }


 
merci d'avance pour votre aide

Reply

Marsh Posté le 16-05-2011 à 19:25:48   

Reply

Marsh Posté le 18-05-2011 à 12:26:56    

Ton code n'est pas trop facile à comprendre car dense mais je pense qu'en une seul requête tu aurais pu avoir ta réponse. Il faut faire une jointure avec de  LEFT JOIN avec un clause sur les valeurs NULL.
 

Code :
  1. SELECT T1.* FROM maTable1 AS T1
  2.   LEFT JOIN maTable2 AS T2
  3.     ON T1.monChamp = T2.monChamp
  4. WHERE T2.monChamp IS NULL


Cette requête va te retourner toute les lignes de la table T1 qui n'ont pas de lien avec la table T2.
- Si à la place de LEFT tu places INNER et que tu retires la clause cela va te donner toute les lignes ayant des correspondance entre les deux tables T1 et T2.
- Si à la place du LEFT tu places RIGHT, dans la clause tu places T1.monChamp IS NULL la situation s'inverse par rapport au premier cas. Il va retourner toute les lignes qui dans T2 n'ayant pas de correspondance dans T1.

Code :
  1. SELECT T2.* FROM maTable1 AS T1
  2.   RIGHT JOIN maTable2 AS T2
  3.     ON T1.monChamp = T2.monChamp
  4. WHERE T1.monChamp IS NULL


 
Si c'est que tu souhaitais faire ce type de requête pourrait te réduire un certain nombre de ligne de code PHP.

Reply

Marsh Posté le 27-05-2011 à 18:09:23    

Bonjour,
 
je comprend le principle de T1 et T2 mais cela ne fonctionne pas dans mon cas.
 
cela fonctionnerais si je voulais comparer une table avec une autre. Mais l'affaire c'est que j'ai deux tables que je veux compater avec une troisième.
 
Exemple:
 
yellow_alert : colonne: email_parents
yellow_Agents_garderies : colonne: AgentID_garderies
yellow_alert_sended : colonne: fusion
 
lorsque le courriel est envoyé aux parents pour lui avisé qu'une garderie est disponible selon les critaires du parent, immédiatement après l'envoie du courriel je log la yellow_alert_sended dans la colonne fusion et je fusionne le mail du parents avec le ID de la garderie. comme cesi:
 
// après que le mail soit envoyé on log l'envoie dans la table yellow_alert_sended pour pouvoir vérifier avant l'envoie à savoir si le mail a déja été envoyé
<code>mysql_query("insert into yellow_alert_sended set fusion = '$aexp[email_parents]$aexp[AgentID_garderies]'" ); </code>
 
MON BUT:
Donc la prochaine vérification avant l'envoie du courriel, je voudrais récupérer les email des parents via la yellow_alert et récupérer les id des garderies via la yellow_Agents_garderies seulement si ils ne sont pas dans la table: yellow_alert_sended.
 
 
dans la colonne fusion nous pouvons voir le mail du parent et le id de la garderie dans le même champs:
parent@domain.com1039
 
 
j'ai essayer ceci selon ton exemple de code mais cela ne fonctionne pas.
 
pouvez-vous m'aidé un peu encore ?
 
<code>  // vérifier les correspondances entre les annonces des garderies et les recherches(alert) des parents enregistrer.
$qexpa = "select DISTINCT * from yellow_alert, yellow_agents_garderies where  
yellow_alert.statut_Alert = 'active' &&  
yellow_alert.statut_Alert = yellow_agents_garderies.statut_annonceID &&  
yellow_alert.CategoryList = yellow_agents_garderies.CategoryID &&  
yellow_alert.Provinces = yellow_agents_garderies.Provinces &&  
yellow_alert.state = yellow_agents_garderies.state && (SELECT '$aparaa$agarderies' AS '$aparaa$agarderies' LEFT JOIN yellow_alert_sended AS yellow_alert_sended ON '$aparaa$agarderies' = yellow_alert_sended.fusion WHERE yellow_alert_sended.fusion IS NULL)";
$rexpa = mysql_query($qexpa) or die(mysql_error());
if(mysql_num_rows($rexpa) > '0')</code>

Reply

Sujets relatifs:

Leave a Replay

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