Suppression de doublons

Suppression de doublons - SQL/NoSQL - Programmation

Marsh Posté le 01-02-2008 à 11:46:44    

Bonjour,
 
Apres deux jours de recherches je ne trouve pas de solutions à mon probleme.
Systeme debian SGBD Mysql server 5.0.
J'ai donc une table (proxy) avec 3 champs une reférences(auto incrémenté),une adresse url et une adresse ip.
J'ai un script qui va récuperer les adresses url et ip dans le log de squid (/var/log/squid/access.log) et qui les inscrit ensuite dans la tables grace à un load data infile.
Tous sa marche trés bien le probleme est que pour une adresse ip je peut avoir plusieurs fois le meme site visité.
exemple l'adresse 192.168.1.25 peut avoir visité le site http://forum.hardware.fr/ 15 fois or je ne souhaite n'avoir qu'une seul occurence il faut donc en supprimer 14.
 
J'ai trouvé la requete select *,count (*) from proxy group by ref,site,ip having count (*) >1 qui me permet de trouver toutes les occurences en trop.
J'ai egallement crée une procedure stocké avec un curseur.

Citation :


create procedure supdoublon()
begin
declare ipa char (20);
declare ipb char (20);
declare refa int (5);
declare refb int (5);
declare sitea char (100);
declare siteb char (100);
declare cursa cursor for select ref,site,ip from proxy;
declare cursb cursor for select ref,site,ip from proxy;
open cursa;
open cursb;
fetch cursa into refa,sitea,ipa;
while refa <>" " do
  while refb<>" " do
    fetch cursb into refb,siteb,ipb;
    if refa <> refb then
        if ipa=ipa then
            if sitea=siteb then
                 delete from proxy where ref=refb;
            end if;
        end if;
     end if;
   end while
fetch cursa into refa,ipa,sitea;
end while;
close cursa;
close cursb;
end //


 
La procédure marche mais elle ne supprimme pas tous les enregistrements seulement une partie je ne sait pas pourquoi.
Si quelqu'un voit l'erreur ou à une solution alternative pour la suppression des doublons sa serait sympas.
Merci. :hello:

Reply

Marsh Posté le 01-02-2008 à 11:46:44   

Reply

Marsh Posté le 01-02-2008 à 11:51:15    

select distinct site from proxy ?

Reply

Marsh Posté le 01-02-2008 à 11:59:17    

Merci, effectivement sa ne m'affiche qu'une seul fois tous les sites visités mais sa ne les supprime pas....

Reply

Marsh Posté le 01-02-2008 à 12:03:45    

essaye un truc dans le genre

Code :
  1. DELETE FROM proxy p WHERE EXISTS (
  2. SELECT
  3.  min(p2.ref),
  4.  ref,
  5.  site
  6. FROM
  7.  proxy p2
  8. WHERE
  9.        p.ref = p2.ref
  10. AND p.url = p2.url
  11. GROUP BY ref, site
  12. HAVING min(p2.ref)<>p.ref)


note: pas testé, de tête donc gaffe la 1ere fois que tu le lances


Message édité par anapajari le 01-02-2008 à 12:04:33

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 01-02-2008 à 12:07:05    

vinsang95 a écrit :

Merci, effectivement sa ne m'affiche qu'une seul fois tous les sites visités mais sa ne les supprime pas....


J'avais pas vu que tu voulais supprimer. :o

Reply

Marsh Posté le 01-02-2008 à 12:54:52    

une autre solution simple :
 

Code :
  1. DELETE proxy
  2. WHERE id NOT IN (
  3.  SELECT min(id)
  4.  FROM proxy
  5.  GROUP BY ip, url
  6. )

Reply

Marsh Posté le 01-02-2008 à 13:15:11    

MagicBuzz a écrit :

une autre solution simple :
 

Code :
  1. DELETE proxy
  2. WHERE id NOT IN (
  3.  SELECT min(id)
  4.  FROM proxy
  5.  GROUP BY ip, url
  6. )



 
Merci c'est une solution que j'avais deja essayée est j'ai une erreur quand je fait sa.

Citation :

ERROR 1093 (HY000) : You can't specify target table 'proxy' for update in FROM clause


 
j'ai pas encore testé l'autre solution je vais essayé ça dans l'aprés midi.
 
Je garde bon espoir .....

Reply

Marsh Posté le 01-02-2008 à 14:12:48    

vu l'erreur, je crois que tu peux dès maintenant commencer à perdre tout espoir...
 
mysql ne semble pas capable de supprimer des lignes dans une table qu'il est en train de lire à l'aide d'une sous-requête.
 
c'est mysql quoi... ça me surprend pas.

Reply

Marsh Posté le 01-02-2008 à 14:33:12    

tu fais un select des min groupé par ip, proxy que tu insert dans un table (eventuellement temporaire)
tu vide la table proxy et tu le re-remplis avec le contenu de ta table temp


Message édité par anapajari le 01-02-2008 à 14:33:23

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 01-02-2008 à 15:02:46    

MagicBuzz a écrit :

vu l'erreur, je crois que tu peux dès maintenant commencer à perdre tout espoir...
 
mysql ne semble pas capable de supprimer des lignes dans une table qu'il est en train de lire à l'aide d'une sous-requête.
 
c'est mysql quoi... ça me surprend pas.


 
Non faut pas dire des choses comme sa c'est mon projet de stage pour mon bts...... :cry:

Reply

Sujets relatifs:

Leave a Replay

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