Comparer le count de la requête?

Mammouth du PHP | 983 Messages

18 mai 2008, 21:39

Il me semble que "AS" est optionnel pour le renommage des tables en SQL ANSI, mais j'avoue ne pas avoir eu le courage de vérifier...

En ce qui concerne ton problème cicom, essaies de supprimer une ligne de moins que la somme trouvée par le count :
<?php
include ('gs_includes/scripts.php');
$sql1 = mysql_query("SELECT count(t1.id) AS compte, t1.camp, t1.pseudo, t1.id FROM pub t1 JOIN pub t2 ON ( t1.pseudo = t2.pseudo AND t1.camp = t2.camp AND t1.id <> t2.id ) WHERE t1.camp = '227' GROUP BY pseudo HAVING (compte > 1)") or die(mysql_error());
while($sql2 = mysql_fetch_array($sql1, MYSQL_ASSOC))
{
 $sql2['compte']--;
 echo $sql2['compte'].' id '.$sql2['id'].' '.$sql2['pseudo'].' <br />';
 if($sql2['compte'] != 0)
 {
  mysql_query("DELETE FROM pub WHERE pseudo = '".$sql2['pseudo']."' AND camp = '".$sql2['camp']."' LIMIT ".($sql2['compte']-1).")";
 }
}
echo 'opération effectuée';
?>

Mammouth du PHP | 555 Messages

18 mai 2008, 22:13

Salut rami,
J'ai déjà essayé un truc similaire mais ca me supprimait tout en bloc (il compte chaque truc tro pde fois je ne sais pas pourquoi...)
Merci de ton aide!
A+ et bon surf!!!!

Mammouth du PHP | 19672 Messages

18 mai 2008, 22:22

J'ai personnellement un peu de mal à saisir ce que tu veux supprimer.

Essaye de formuler dans tes mots (donc en français et non en SQL) selon quelles conditions tu veux supprimer des lignes dans quelle table : si ta formulation est correcte, il restera juste à la traduire en SQL après, ce sera infiniment plus facile :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 555 Messages

18 mai 2008, 23:05

Salut,
Je veux supprimer dans ma table tous les doublons sur le champ camp et le champ pseudo en laissant un enregistrement uniquement à chaque fois.
exemple si dans ma db j'ai ('','226','cicom');('','227','cicom');('','226','cicom');('','225','cicom');('','226','cicom');('','227','cicom');('','226','cicom')
je veux qu'il reste
('','226','cicom');
('','227','cicom');
('','225','cicom');
L'ordre des id n'ayant pas d'importance.
Merci de votre aide!
A+ et bon surf!!!!

ViPHP
ViPHP | 4674 Messages

19 mai 2008, 00:00

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 2937 Messages

19 mai 2008, 01:28

Salut,
Je veux supprimer dans ma table tous les doublons sur le champ camp et le champ pseudo en laissant un enregistrement uniquement à chaque fois.
exemple si dans ma db j'ai ('','226','cicom');('','227','cicom');('','226','cicom');('','225','cicom');('','226','cicom');('','227','cicom');('','226','cicom')
je veux qu'il reste
('','226','cicom');
('','227','cicom');
('','225','cicom');
L'ordre des id n'ayant pas d'importance.
Merci de votre aide!
Je vois qu'on a affaire à une table mal conçue, en ce sens que l'on pouvait dès le départ créer des clés d'index unique sur la(les) colonne(s) concernées.

Pour remédier à ton problème, il faudrait appliquer la requête suivante :

Code : Tout sélectionner

SELECT COUNT(id) FROM ta_table WHERE id='226'
récupérer le nombre retourné pour exécuter la requête suivante :

Code : Tout sélectionner

DELETE FROM ta_table WHERE id='226' LIMIT n-1
en remplaçant n-1 par le résultat de la soustraction de 1 du nombre retourné, sous peine d'erreur de syntaxe.

Mammouth du PHP | 19672 Messages

19 mai 2008, 06:27

En une seule requête, je doute que ce soit faisable. Pour ma part, le seul truc que je vois, ce serait de passer par une table temporaire pour y stocker chaque occurrence unique, vider la table d'origine et d'y ré-injecter le contenu de la table temporaire. :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 4674 Messages

19 mai 2008, 09:07

En une seule requête, je doute que ce soit faisable. Pour ma part, le seul truc que je vois, ce serait de passer par une table temporaire pour y stocker chaque occurrence unique, vider la table d'origine et d'y ré-injecter le contenu de la table temporaire. :-k
Un peu comme j'avais dis de faire en deux requêtes quoi …
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 555 Messages

19 mai 2008, 18:40

Salut à tous!
Merci de vos nombreuses réponses!
A HyWaN => Merci pour ton lien, très intéressant mis à part que je n'ai pas encore vu la notion de procédure dans la bdd (faudrait que je m'achète un bon gros bouquin sur le SQL histoire d'avoir des connaissances pro sur le SQL (un peu plus que jointure, création, insert, update, delete et constraint quoi...)
A Victor => Bien évidement que la table est mal conçue c'est sur ce site que j'ai fait mes tous premiers pas en php sql etc..., d'ailleurs les deux tiers de mes messages sur ce forum doivent le concerner...
On a déjà essayé ton système mais le count avec la jointure compte un peu n'importe quoi, du coup le delete me supprime tout en bloc...
A Cyrano => Cette opération ne sera-t-elle pas plus lourde que celle que j'effectue déjà?
Merci à tous!
A+ et bon surf!!!!

Mammouth du PHP | 983 Messages

19 mai 2008, 19:45

L'article de développez.com fournit une manière élégante de supprimer les doublons. Si j'avais à le faire désormais, j'utiliserais cette méthode.
Néanmois, n'aimant pas resté sur un échec, voilà une solution (testée) qui a l'air de fonctionner.
J'ai corrigé la 1ere requête pour que le count() soit correct :

Code : Tout sélectionner

mysql> use test; Database changed mysql> SELECT * FROM pub; +----+------+--------+ | id | camp | pseudo | +----+------+--------+ | 1 | 226 | cicom | | 2 | 227 | cicom | | 3 | 226 | cicom | | 4 | 225 | cicom | | 5 | 226 | cicom | | 6 | 227 | cicom | | 7 | 226 | cicom | +----+------+--------+ 7 rows in set (0.00 sec) mysql> SELECT count(id) AS compte, t1.camp, t1.pseudo FROM pub t1 GROUP BY pseudo,camp HAVING (compte > 1); +--------+------+--------+ | compte | camp | pseudo | +--------+------+--------+ | 4 | 226 | cicom | | 2 | 227 | cicom | +--------+------+--------+ 2 rows in set (0.00 sec)
Il ne reste plus qu'à supprimer une ligne de moins que le count() :
<?php
$sql1 = mysql_query("SELECT count(id) AS compte, t1.camp, t1.pseudo FROM pub t1 GROUP BY pseudo,camp HAVING (compte > 1)") or die(mysql_error());
while($sql2 = mysql_fetch_array($sql1, MYSQL_ASSOC) )
{
    echo '<pre>' . print_r($sql2, 1) . '</pre>';
    echo '<br />'.$sql2['compte'].' id '.$sql2['id'].' '.$sql2['pseudo'].' <br />';
    if($sql2['compte'] > 1 )
    {
        $delCount = $sql2['compte'] - 1;
        echo '<br />Suppression de '. $delCount . ' '. $sql2['pseudo'] . ' ' . $sql2['camp'] ;
        $sql = "DELETE FROM pub WHERE pseudo = '".$sql2['pseudo']."' AND camp = ".$sql2['camp'] . " LIMIT $delCount";
        echo "<br />$sql";
        mysql_query( $sql );
    }
}
echo 'opération effectuée';
J'attends vos retours ;)

Mammouth du PHP | 555 Messages

19 mai 2008, 21:57

Salut,
Beaucoup plus léger que ma méthode (normal avec une requête en moins par itération..) surtout quand on enlève une partie de l'affichage (mais je t'en remercie, cet affichage m'a permis de contrôler le bon fonctionnement sur mon server test)
En plusieurs exécutions je devrais arriver à nettoyer ma base de données plus vite.
Je mets au défit qui que ce soit de faire dans la même simplicité et aussi léger.
Merci à tous de votre aide!
EDIT mon server principal y est arrivé en une seule exécution contre 18 pour mon server test.
De plus j'avais fait 14 exécutions(11000 enregistrements supprimés sur 38000) de mon scripts sur le server principal sans être arrivé au bout, bien joué donc Rami, je mets résolu
A+ et bon surf!!!!