Problème pour faire une requête SQL.

Problème pour faire une requête SQL. - SQL/NoSQL - Programmation

Marsh Posté le 28-03-2008 à 13:11:16    

Bonjour,
j'aimerais faire une requete SQL mais je ne sais pas trop comment m'y prendre. Pour simplifier les choses voila les tables que j'ai :

Citation :

Table joueurs avec id
Table messages avec id, id_destinataire, message.


Ce que j'aimerais c'est pour chaque joueur vérifier si il a plus de 20 messages. Si c'est le cas supprimer tous ses messages.
En gros voila ce que j'aimerais faire :
 

Code :
  1. <?PHP
  2. // recupere tous les joueurs
  3. $reponse = mysql_query('SELECT id FROM joueurs');
  4. while ($donnees = mysql_fetch_array($reponse))
  5. {
  6.    $id = $donnees['id'];
  7.  
  8.    // le nombre de messages stoquer par un joueur
  9.    $reponse1 = mysql_query("SELECT COUNT(*) AS num FROM messages WHERE id_destinataire='$id'" );
  10.    $donnees1 = mysql_fetch_array($reponse1);
  11.  
  12.    // si il a plus de 18 messages, on efface tous ses messages
  13.    if ($donnees1['num'] > 20)
  14.       mysql_query("DELETE FROM messages WHERE id_destinataire='$id'" );
  15. }
  16. ?>


 
Comme vous le voyez c'est super moche. Si j'ai 3000 personnes dans ma BDD, ça fera au moins 3000 requêtes... mais j'arrive pas à voir comment faire autrement.
 
Merci d'avance a ceux qui m'aiderons :)

Reply

Marsh Posté le 28-03-2008 à 13:11:16   

Reply

Marsh Posté le 28-03-2008 à 13:46:47    

Déjà, tu peux récupérer en 1 seule requête la liste des id ayant plus de 20 entrées dans la table messages :
 
SELECT id_destinataire, COUNT(1) nb
FROM messages
GROUP BY id_destinataire
HAVING nb > 20
 
(le "group by" permet d'exécuter le "count" pour chaque id_destinataire, et le HAVING permet de filtrer les lignes sur le résultat du "count" ).

Reply

Marsh Posté le 28-03-2008 à 14:44:44    

Merci beaucoup, je connaissais pas tout ca !
Je vais voir si ça marche.
 
Mais y'a t'il un moyen de faire aussi la suppression des message dans la même requête ?
 

Code :
  1. $rep = mysql_query("SELECT id_destinataire, COUNT(1) nb FROM messages GROUP BY  id_destinataire HAVING nb > 18" );
  2. while ($donnees = mysql_fetch_array($rep))
  3. {
  4.    $id = $donnees['id_destinatairet'];
  5.    mysql_query("DELETE FROM messages WHERE id_destinataire='$id'" );
  6. }



Message édité par gniii2 le 28-03-2008 à 14:45:49
Reply

Marsh Posté le 28-03-2008 à 19:57:45    

Je pense que non. La recherche des id (lecture) et la suppression portant sur la même table, je ne pense pas que le SGBD accepte de les méler dans une même requête [:proy]

Reply

Marsh Posté le 31-03-2008 à 21:42:20    

Merci beaucoup pour ces précisions ! :)

Reply

Sujets relatifs:

Leave a Replay

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