Avatar billede syswatch Novice
20. november 2009 - 11:30 Der er 7 kommentarer og
1 løsning

Fjerne dobbelt records i udtræk fra DB

Hejsa,
Jeg trækker en masse records ud fra en DB hvor der godt kan være dobbelt records, med SELECT * FROM. (De må gerne være i DB'en.)
Men når jeg trækker det ud fra DB til visning ønsker jeg kun at se dem 1 gang. Og det er feltet: VARENR som der kun må optræde 1 gang.

Hvordan gør jeg det... Har kigget på DISTINCT og GROUP BY, men det virker ikke rigtigt synes jeg.
Er der en anden måde.
Avatar billede repox Seniormester
20. november 2009 - 11:36 #1
DISTINCT er den rigtige måde at gøre det på.
Avatar billede syswatch Novice
20. november 2009 - 11:43 #2
Ja, men hvor skriver jeg query'en så den tager alle felterne med, men kun laver DISTINCT på varenr feltet ?
Avatar billede mrgumble Nybegynder
20. november 2009 - 11:43 #3
Hvorfor er det, at din DISTINCT ikke virker? Hvilket resultat får du?

Og hvordan er din tabelstruktur? Hvad er forskellen på et sæt dobbelt records, siden du (a) har behov for begge records og (b) du kun vil have den ene?
Avatar billede michael_stim Ekspert
20. november 2009 - 11:45 #4
Hvis du nu har f ex:
varenr: 1234  tekst: sutsko
varenr: 1234  tekst: træsko

Og laver en SELECT DISTINCT * FROM tabel;
Vil den tage begge records.

Tager du derimod SELECT DISTINCT varenr FROM tabel;
Tager den kun 1234 én gang.
Avatar billede syswatch Novice
20. november 2009 - 11:52 #5
Jeg bliver vist lige nød til at komme med en lille redegørelse.
Der kan godt være flere records i databasen med samme varenr, da varen kan ha flere lokationer.

Så tabel strukturen kan se sådan her ud:

varenr, beskrivelse, beskrivelse2, pris, lokation, osv

Så Varenr kan godt være det samme, men lokation vil være forskellig, og derfor virker DISTINCT ikke, da den kun vil fjerne records der er 100% identiske, og det er disse jo ikke da lokation vil være forskellig.

Men kan man ikke fjerne dem efter udtrækket, altså i arrayet ?
Avatar billede mrgumble Nybegynder
20. november 2009 - 11:53 #6
Jeg vil trække videre på michael_stims eksempel:
[code]
varenr | tekst
------------------
1234  | sutsko
1234  | trasko
1235  | hyttesko
1235  | snabelsko
[/code]

Hvis du vil lave en distinct på varenr., hvad bestemmer om der er hhv. sutsko/trasko eller hyttesko/snabelsko der skal returneres?
Avatar billede mrgumble Nybegynder
20. november 2009 - 11:59 #7
Hov, der var du lidt hurtigere.
Du har mulighed for følgende:

[code]SELECT * FROM mine_varer WHERE varenr IN (SELECT DISTINCT varenr FROM mine_varer)[/code]


(Bemærk, en SELECT * er en dårlig idé, så lad være med at bruge det fast).
Avatar billede mrgumble Nybegynder
20. november 2009 - 12:08 #8
Men, men, men - hvor mange af dine data er redundant i din opsætning?
[code]
varenr |    navn  |  beskrivelse  | pris | lokation | tilføjet af | i_lager
-----------------------------------------------------------------------------
  1  |  sutsko  | bruges hjemme  |  10  | herning  |    jens    |    15
  1  |  sutsko  | bruges hjemme  |  10  |  ikast  |    jens    |    20
  2  |  trasko  | paa gaarden    |  18  | herning  |    jens    |    8
  2  |  trasko  | paa gaarden    |  18  |  ikast  |    jens    |    2
osv.

[/code]

Du skal dele dine data op, så du undgår mest mulige redudans i dine data. I ovennævnte eksempel kan du lave følgende:
[code]Tabel: lokationer
lokation_id | adresse      | postnr | by
------------------------------------------------
    1      | Skovej 1      |  7400  | Herning
    2      | Tekstilvej 17 |  7430  | Ikast

Tabel: varer
varenr |    navn  |  beskrivelse  | pris | tilføjet af
---------------------------------------------------------
    1  |  sutsko  | bruges hjemme  |  10  |    jens
    2  |  trasko  | paa gaarden    |  18  |    jens

Tabel: vare_paa_lager
varenr | location  | paa_lager
--------------------------------
  1    |    1    |    15
  1    |    2    |    20
  2    |    1    |    8
  2    |    2    |    2
[/code]


Det giver en bedre fordeling af informationerne og mindre belastning når du f.eks. kun vil have vist hvilke varer du har. Hvis du vil vide hvilke varer du har på lager, kan du gøre følgende:
[code]SELECT varenr, navn FROM varer WHERE varenr IN (SELECT DISTINCT varenr FROM vare_paa_lager WHERE paa_lager > 0)[/code]

Du har også gode muligheder for at krydse tabellerne sammen ("JOIN" i SQL) på forskellige måder.
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