Gå til innhold

MySQL - Slette tekstfelt som er like


Gjest Slettet-IHWlGMJn

Anbefalte innlegg

Gjest Slettet-IHWlGMJn

Dette er ikke helt hva jeg har, men for å lage et lett eksempel som i praksis blir det samme så sier vi at jeg har en database med en tabell som inneholder id og tekst. La oss si den ser slik ut:

id tekst

1 asdf

2 jklø

4 asdf

42 ompa

86 asdf

Her er det da ønskelig at jeg har et script som sletter de ekstra asdf-radene. Hvilke har ingenting å si...

 

Jeg har laget dette(Som er helt elendig):

Klikk for å se/fjerne innholdet nedenfor
PHP

<?php

 

$connection mysql_connect("server","database","passord");

mysql_select_db("database"$connection);

 

$result1 mysql_query('SELECT * FROM tabell');

$num_rows1 mysql_num_rows($result1);

 

echo "<table border="1"><tr><th>id</th><th>tekst</th></tr>";

for($i=1;$i<=$num_rows1;$i++){

$row1 mysql_fetch_array($result1);

 

$result2 mysql_query('SELECT * FROM tabell');

$num_rows2 mysql_num_rows($result2);

 

for($j=1;$j<=$num_rows1;$j++){

$row2 mysql_fetch_array($result2);

if($row2['tekst'] == $row1['tekst'] && $row1["id"] != $row2["id"]){

echo "<tr style="background: #f00;"><td>".$row2["id"]."</td><td>".$row2['tekst']."</td></tr>";

}

}

}

echo "</table>";

echo $num_rows1;

 

mysql_close($connection);

?>

Om du kjører det skal du få opp en tabell med 4 rader(ink. header) der alle asdf-radene er, men problemet er jo at dette tar veldig lang tid om du har mange rader(Jeg har rundt 2300 i min faktiske tabell) og du vil få opp alle radene der det er duplikasjon av tekst, ikke bare de du vil slette.

 

Da skjønner vel alle problemet. Kan legge til at jeg vil fint klare å kode om til at den skal slette radene og ikke bare echo-e dem, men som sagt viser den alle og ikke bare de ekstra. Derfor blir ikke det ønskelig å legge inn sletting i denne koden.

Og ellers må jeg jo nesten legge til at jeg ikke er noen reser i verken php eller mysql.. så det er mulig det er en veldig enkel løsning på dette problemet og jeg driter meg helt ut her..

PS. Sikkert skriveleif her, men vil tro alle forstår det som er skrevet. Er litt for seint for retting av leif nå.. :sleep:

Lenke til kommentar
Videoannonse
Annonse

Leste litt på mysql.com, kanskje denne karens forslag kan hjelpe deg:

- Deleting Duplicate Entries -

 

I had a many-to-many relational table that joined users and events. Some users might save the same event more than once...so I wanted to know a way to delete duplicate entries. The table has a primary key "ueventID" (auto-increment) and two foreign keys "userID" and "eventID". In order to delete duplicate entries, I found that this solution worked quite well for me.

 

DELETE tbl_name FROM tbl_name t1, tbl_name t2 WHERE t1.userID=t2.userID AND t1.eventID=t2.eventID AND t1.ueventID < t2.ueventID

 

This will delete all but the very last entry of the duplicates. If there are any better ways to do this, feel free to let me know. I'll try to remember to check back later.

 

Honestly, though, while I wanted to know how to do this...officially, I just check to see if it's a duplicate entry BEFORE I insert it so that I don't have to hassle with this :-P

 

Lenke til kommentar
Gjest Slettet-IHWlGMJn

Ok.. jeg er som sagt på tryne i mysql. Hva er alle t1 og t2-greiene i den spørringa?

DELETE tbl_name FROM tbl_name t1, tbl_name t2 WHERE t1.userID=t2.userID AND t1.eventID=t2.eventID AND t1.ueventID < t2.ueventID
Lenke til kommentar
Ok.. jeg er som sagt på tryne i mysql. Hva er alle t1 og t2-greiene i den spørringa?
DELETE tbl_name FROM tbl_name t1, tbl_name t2 WHERE t1.userID=t2.userID AND t1.eventID=t2.eventID AND t1.ueventID < t2.ueventID

9541640[/snapback]

 

Det er en måte å skrive alias på

"tbl_name t1" betyr at etter dette vil jeg kalle tabellen t1.

"tbl_name t2" betyr at etter dette vil jeg kalle tabellen t2.

 

Det kan også skrives tbl_name AS t1, men mysql lar deg droppe AS

 

Som du ser kan du da sjekket rader i tabellen mot seg selv, uten at det trenger å være samme rad.

Endret av Ekko
Lenke til kommentar
Gjest Slettet-IHWlGMJn

Dette skjønner jeg fint lite av. Kan ikke så mye php, men kan mye mindre av mysql! Og "DELETE tbl_name". Vil den slette tabellen??

 

Kan noen forklare hele

DELETE tbl_name FROM tbl_name t1, tbl_name t2 WHERE t1.userID=t2.userID AND t1.eventID=t2.eventID AND t1.ueventID < t2.ueventID

Eller evt. fikse den sånn at den gjør det jeg vil?

 

EDIT:

Fant en sak og skrev den om..

SELECT * FROM tabell A WHERE id > (SELECT min(id) FROM tabell B WHERE A.tekst = B.tekst);

Den ser ut til å fungere, men kan noen bekrefte at denne faktisk fungerer(Og ikke gjør noe uønsket for min del)? Jeg er nemlig ikke helt into hva som faktisk skjer her...

 

Den sletter dog fortsatt ikke, men det er vel bare å bytte ut den første SELECTen med DELETE..?

 

EDITEDIT:

Eller dvs.. jeg skjønner jo hva som skjer i den jeg posta bortsett fra dette med alias. Fint om noen kunne forklart enda bedre eller postet en link til en forklaring

Endret av Slettet-IHWlGMJn
Lenke til kommentar
Gjest Slettet-IHWlGMJn

Får ikke til å slette med denne spørringen:

DELETE FROM tabell A WHERE id > (SELECT min(id) FROM tabell B WHERE A.tekst = B.tekst);

 

Får opp at det er feil syntax.. hva er det som egentlig er feil?

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...