Avatar billede supa Nybegynder
21. april 2006 - 13:46 Der er 12 kommentarer

Dubletter i DB

Hej,

I min database er der en tabel, som kan indeholde dubletter. Når jeg hiver data fra denne tabel ud, så vil jeg gerne at jeg ikke få dubletter i eks. et array, eller echo/print..

Med andre ord, hvis jeg har "25225" til at stå i tabellen 2 eller flere gange, så vil jeg kun få oplyst "25225" én gang, og ikke adskillige gange..

Hvordan kan jeg undgå at få dubletter..?
Avatar billede leif Seniormester
21. april 2006 - 13:50 #1
At lave feltet til Unique så kan der kun være 1 record med værdien.
Avatar billede zappa Nybegynder
21. april 2006 - 13:56 #2
Proev med DISTINCT

dvs. select DISTINCT ... from Tabel...
Avatar billede supa Nybegynder
21. april 2006 - 14:10 #3
Unique er ikke en mulighed, da den samme værdi skal kunne være i databasen adskillige gange..

DISTINCT: Det virker tildels.. Problemet er så at jeg kun får en kolonne ud, og jeg skal gerne bruge alle kolonnerne..
Avatar billede gf Nybegynder
21. april 2006 - 14:30 #4
Select * From din db WHERE noget = noget GROUP BY noget andet

mvh gf
Avatar billede zappa Nybegynder
21. april 2006 - 14:32 #5
Hjaelper det paa problemet, hvis du tilfoejer flere felter? Dvs:

select DISTINCT X, Y, Z from tabel...

- dette er sikkert ikke det du mente :)
Avatar billede coderdk Praktikant
21. april 2006 - 14:36 #6
DISTINCT hedder også DISTINCTROW, så det er mao hele rækken der skal være unik...
Avatar billede supa Nybegynder
21. april 2006 - 14:53 #7
EKS:
"26732", "jim", "elefant"
"26731", "astro", "giraf"
"26732", "kaj", "tiger"

Der vil jeg gerne have de to første, men ikke den tredje række siden at den første kolonne indeholder 2 ens..

Sådan jeg får dette resultat:

"26732", "jim", "elefant"
"26731", "astro", "giraf"

Det er simplethen blot den første kolonne der interesserer mig..
Avatar billede coderdk Praktikant
21. april 2006 - 14:58 #8
Så skal du nok bruge noget a la gf's løsning, tror jeg
Avatar billede duejensen Nybegynder
21. april 2006 - 17:10 #9
GROUP BY kan ikke klare dette, da GROUP BY kræver at du kun selecter felter der grupperes efter eller felter aggrerede felter.

Du kan altså godt skrive
select X, y, min(z),sum(W) from tabel ......
group by X,Y

men ikke
select X, y, z, w from tabel .....
group by x,Y

I dit eksempel ovenfor er der heller ingen logik i at du vil have resultatet
"26732", "jim", "elefant"
"26731", "astro", "giraf"

frem for

"26732", "kaj", "tiger"
"26731", "astro", "giraf"


Nu kender vi jo ikke til det præcise formål, men hvis det da ikke ødelægger noget andet, vil det nemmeste være at sikre at der slet ikke kommer dubletter i tabellen, så giver resultatet jo sig selv.

Du kan selvfølgelige have specielle grunde til at du vil tillade dubletter (tabellen bruges til andet)
Avatar billede sw_red_6 Nybegynder
21. april 2006 - 17:31 #10
Øhh muligvis ikke det du vil have men har du prøvet array_unique?
se her: http://dk.php.net/manual/en/function.array-unique.php
Avatar billede coderdk Praktikant
21. april 2006 - 18:52 #11
Alternativt kan du bare sortere dubletterne fra i dit loop:

$ids = array();
while ( $row = mysql_fetch_assoc() )
{
  if ( !in_array( $row['id'], $ids ) )
  {
      $ids[] = $row['id'];
      // Skriv den ud
  }
}
Avatar billede duejensen Nybegynder
21. april 2006 - 19:48 #12
loop sorteringen kan evt simplificeres, hvis der er er en ORDER BY ID med i selecten.

Så kan man blot sammenligne med den sidste fundne værdi

$last_id = "";  // Forudsætter at der ikke findes "" værdi i tabellen.
while ( $row = mysql_fetch_assoc() )
{
  if ( $row['id'] != $last_id ) )
  {
      $last_id= $row['id'];
      // Skriv den ud
  }
}
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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