Avatar billede nemlig Professor
16. oktober 2010 - 12:28 Der er 7 kommentarer og
1 løsning

Fjern ekstra poster med bruger, hvis bruger fremgår i flere poster

Hejsa.
Jeg har en tabel, hvor jeg har nogle brugere registreret. Jeg ønsker at fjerne flere forekomster af samme bruger:

|id|brugerid|listenr|
|14|27      |3      |
|15|45      |4      |
|16|27      |1      |
|17|27      |2      |

Brugerid 27 fremgår 3 gange. Hvordan fjerner jeg de 2 andre, således jeg beholder det brugerid, hvor listenr er lavest. Altså jeg ønsker at beholde postid. nr. 16.

Der kan i øvrigt ikke forekomme flere poster med ens brugerid, og hvor listenr er ens.

Jeg arbejder med PHP.
Avatar billede showsource Seniormester
16. oktober 2010 - 14:08 #1
Ehh, kunne ikke lave det i en query, og tror faktisk ikke det er muligt, når du gerne vil bibeholde laveste listenr.


$usql = "SELECT bruger, MIN(listenr) as nr, COUNT(*) as antal FROM tabel GROUP BY bruger HAVING antal > 1";
$rows =  mysql_query($usql) or die (mysql_error());

if(mysql_num_rows($rows) > 0) {

    while($b = mysql_fetch_object($rows)) {
    $del = "DELETE FROM tabel WHERE bruger = ".$b->bruger." AND listenr != ".$b->nr;
    mysql_query($del) or die (mysql_error());

    echo"<br>Slettet ".mysql_affected_rows()." rows for brugerid ".$b->bruger;
    }

}else{
echo"ingen rows at slette!";

}
16. oktober 2010 - 14:52 #2
Ja, det ser ud til at vaere problematisk i MYSQL at slette raekker i en tabel baseret paa kriteria i den samme tabel (men det kan vaere paa grund af mit niveau med MYSQL.)  Men man kan kopiere de rigtige raekker (de med unikke brugerids og de med minimum listnr hvor der er duplikat brugerid) over i en ny tabel med "INSERT INTO .... SELECT...."

Jeg lavede en tabel nemlig2 med nedenstaaende raekker og en tom tabel nemlig3 med de samme kolonner.  Med denne query fik jeg de rigtige raekker kopieret over:

INSERT INTO nemlig3 SELECT * FROM nemlig2 WHERE listnr IN (
SELECT MIN(listnr) FROM nemlig2 GROUP BY brugerid HAVING COUNT(*) > 1
UNION
SELECT listnr FROM nemlig2 GROUP BY brugerid HAVING COUNT(*) = 1);

Mine data:

id  brugerid  listnr 
      1 5 5
      2 3 3
      3 7 7
      4 5 55
      5 2 2
      6 8 8
      7 5 555
      8 7 77
      9 5 5555
      10 1 1

resultatet:

id  brugerid  listnr 
      1 5 5
      2 3 3
      3 7 7
      5 2 2
      6 8 8
      10 1 1
Avatar billede nemlig Professor
16. oktober 2010 - 15:05 #3
Tak for bidragene.
Jeg er i fuld gang med Showsources forslag, hvilket umiddelbart ser lovende ud.
Avatar billede nemlig Professor
16. oktober 2010 - 16:03 #4
Showsource - du kom først med en løsningen, og som jeg arbejdede videre med. Det virker perfekt.
Send venligst et svar.
Christian_belgien: Tak for dit bidrag, men jeg giver pointene til Showsource, da det endte med hans løsning.
16. oktober 2010 - 16:29 #5
Fair enough.
Avatar billede showsource Seniormester
16. oktober 2010 - 22:37 #6
Hmm, svar
Avatar billede showsource Seniormester
17. oktober 2010 - 17:17 #7
Ehh, lige en ting:
I stedet for at afvikle en query for hvert fundne row, kan det samles til en:



$usql = "SELECT bruger, MIN(listenr) as nr, COUNT(*) as antal FROM tabel GROUP BY bruger HAVING antal > 1";
$rows =  mysql_query($usql) or die (mysql_error());

if(mysql_num_rows($rows) > 0) {

$del = array();

    while($b = mysql_fetch_object($rows)) {
    $del[] = "bruger = ".$b->bruger." AND listenr != ".$b->nr;
    }

$sql = "DELETE FROM tabel WHERE ";
$sql .= implode(" OR ", $del);
mysql_query($sql) or die (mysql-error());

echo mysql_affected_rows()." row er slettet";

}else{
echo"Ingen rows at slette!";

}

mysql_free_result($rows);
Avatar billede nemlig Professor
17. oktober 2010 - 19:07 #8
Sejt - tak for denne gode bonus-info.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester