8791 sujets

Développement web côté serveur, CMS

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



//get the info yellow_alert (parents)
$qparaa = "select yellow_alert.email_parents from yellow_alert where AlertID";
$rparaa = mysql_query($qparaa) or die(mysql_error());
$aparaa = mysql_fetch_array($rparaa);

//get the info yellow_Agents_garderies
$qgarderies = "select yellow_agents_garderies.AgentID_garderies from yellow_agents_garderies where AgentID_garderies";
$rgarderies = mysql_query($qgarderies) or die(mysql_error());
$agarderies = mysql_fetch_array($rgarderies);

// verifier si le email a deja été envoyer selon la table de log yellow_alert_sended
$qnotsend = "select * from yellow_alert_sended where yellow_alert_sended.fusion != '$aparaa$agarderies' ";
$rnotsend = mysql_query($qnotsend) or die(mysql_error());
if(mysql_num_rows($rnotsend) > '0')
{
echo "exit car le email a déjà été envoyer";
exit();
}
// si non, on continue et on envoie les avis courriels a tous ceux qui ne sont pas dans la table yellow_alert_fusion….
//blabla…
// on log la table yellow_alert_sended.. 
//… exit..


J’ai essayé aussi le code suivant avec un NOT IN :


// vérifier les correspondances entre les annonces des garderies et les recherches(alert) des parents enregistrer.
// avec le NOT IN j’essaie d’exclure ceux qui sont déjà dans la table yellow_alert_sended.
$qexpa = "select * from yellow_alert, yellow_agents_garderies where 
yellow_alert.statut_Alert = 'active' && yellow_agents_garderies.statut_annonceID = 'active' && 
yellow_alert.CategoryList = yellow_agents_garderies.CategoryID && yellow_alert.Provinces = yellow_agents_garderies.Provinces && 
yellow_alert.state = yellow_agents_garderies.state &&
'$asended' NOT IN ((select yellow_alert.email_parents from yellow_alert where AlertID)(select yellow_agents_garderies.AgentID_garderies from yellow_agents_garderies where AgentID_garderies))";
$rexpa = mysql_query($qexpa) or die(mysql_error());
if(mysql_num_rows($rexpa) > '0')

{
while($aexp = mysql_fetch_array($rexpa))
{ 
// 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
// blabla..
//….
}
}
{
echo "exit car le email a deja ete envoyer car il est déjà logé dans la table yellow_alert_sended";
exit();
}



merci d'avance pour votre aide
Bonjour !

Déjà, je vois dans tes requêtes une drôle de condition : "where AlertID"

A quoi correspond cet AlertID ?

Pour ton problème, je pense que NOT IN est effectivement la meilleure solution.

Il serait intéressant de savoir comment sont structurées tes tables, mais voilà comment je pense qu'elles devraient être dans l'idéal :

Une table yellow_Alert_sended qui contiendrait deux champs : un id_alert et un content. Ce dernier pourrait stocker le message de l'alerte envoyée.

Une table garderies, avec au moins un champ id_garderie.

Une table parents, avec au moins un champ id_parent, un champ id_garderie et un champ mail.

Et enfin une table alerts2garderies pour lier les garderies et les alertes : un champ id_alert et un champ id_garderie.

A chaque fois que tu envoies une alerte à une garderie, tu stockes dans alerts2garderies l'id de l'alerte et l'id de la garderie. Ainsi, tu peux connaitre facilement quelles garderies ont été avisées de telles alertes !

Une requête de ce style devrait alors pouvoir fonctionner :

SELECT mail FROM parents
WHERE id_garderie NOT IN
(
    SELECT id_garderie FROM alerts2garderies
    WHERE id_alert=ID_ALERT_QUE_TU_VEUX_FILTRER
)


Cette structure suppose cependant que les parents ne peuvent être liés qu'à une garderie. Si ce n'est pas le cas, il faudrait rajouter une autre table, et la requête serait un peu plus complexe ^^