Avatar billede groyk Novice
08. oktober 2012 - 20:34 Der er 10 kommentarer og
1 løsning

LeftJoin distinct

Hej Experter

Jeg har to tabeller.

En med filoplysninger og en med TAGS der tilhører hver fil
ex.
doc_files
ID|FILENAME|PATH
doc_tags
TAGID|TAG

Hver fil kan naturligvis godt have flere tags. Det output jeg søger er at der kommer en post ud af MySQL pr. fil.

Men tricket er at der skal kunne søges i ALLE tags.

Hvordan gøres det lige??

Mvh
Simon
Avatar billede arne_v Ekspert
08. oktober 2012 - 20:38 #1
Hvordan skal de 2 tabeller knyttes sammen?
Avatar billede mireigi Novice
08. oktober 2012 - 21:01 #2
Lav en tredje tabel, ex. doc_file_tags, til at joine doc_files og doc_tags, ved at bruge primærnøglerne fra hver, som en sammensat primærnøgle i den nye tabel.

Når det er gjort, kan du gøre dette:

SELECT DISTINCT PATH, FILENAME
FROM doc_files AS Files
  INNER JOIN doc_file_tags AS FileTags ON Files.ID = FileTags.ID
  INNER JOIN doc_tags AS Tags ON FileTags.TAGID = Tags.TAGID
WHERE TAG IN ('Tag1', 'Tag2', 'Tag3')
Avatar billede groyk Novice
08. oktober 2012 - 21:17 #3
arne_v
Tabellerne bliver knyttet sammen på id -> doc_id i den anden tabel. Burde jeg have skrevet til at starte med.

mireigi
Tror ikke jeg er helt med. Kan ikke se hvorfor det skulle være nødvendigt med en ekstra tabel. (Måske noget med den manglende tilknytning ovenfor.)

asdfg
asdg
Avatar billede arne_v Ekspert
08. oktober 2012 - 21:25 #4
SELECT *
FROM doc_files
WHERE id IN(SELECT doc_id FROM doc_tags WHERE tag='xxxxxx')

maaske
Avatar billede mireigi Novice
08. oktober 2012 - 21:40 #5
Grunden til en ekstra tabel, er at du så kun skal angive hvert tag én gang. Hvis du gemmer hver tag, tilknyttet til ét specifikt dokument, skal du oprette en ny række i din doc_tags tabel, hver gang du tilknytter et eksisterende tag til et nyt/andet dokument.

Eksempel:

doc_files
ID | Path | Filename
---------------------
1  | C:\  | test.doc
2  | C:\  | test2.doc
3  | C:\  | test3.doc

doc_tags
TAGID | DOCID | Tag
---------------------
1    | 1    | Hest
2    | 2    | Hest
3    | 3    | Hest
4    | 1    | Kat
5    | 2    | Hund
6    | 3    | Kat


Du får med andre ord mange gengangere af data.
Du bør stræbe efter at overholde de 3 normalformer

Hvis du gør det, får du følgende:
doc_files
ID | Path | Filename
---------------------
1  | C:\  | test.doc
2  | C:\  | test2.doc
3  | C:\  | test3.doc

doc_tags
TAGID | Tag
---------------------
1    | Hest
2    | Kat
3    | Hund

doc_file_tags
TAGID | DOCID
--------------
1    | 1
1    | 2
1    | 3
2    | 1
3    | 2
2    | 3


Du har dermed gjort dine data i begge tabeller unikke, og samlet dem i en tredje tabel. Det virker måske som overkill, men det er standard databasedesign. Ikke alene er det nemmere for databasen at holde styr på dine data, da der er mindre data og flere nøgler at indeksere, det fylder også meget mindre på disken.

Genbrugelige data bør, som hovedregel, holdes i en tabel for sig selv. Tags er genbrugelige, da ét tag kan bruges på flere dokumenter.
Avatar billede groyk Novice
08. oktober 2012 - 21:35 #6
Prøver mig frem, takker for hint.
Avatar billede arne_v Ekspert
08. oktober 2012 - 21:53 #7
M:M modellen er meget brugt.

Men man skal være sikker på at samme tag nu er samme tag.

Hvis vi bruger eksemplet ovenfor og man kigger på test2.doc og retter tag "Hund" til "Puddel hund" vil man så have at tag også ændres på test.doc?
Avatar billede mireigi Novice
08. oktober 2012 - 23:06 #8
Det er så der at man fjerner tagget Hund fra relationen til test2.doc og opretter det nye tag Puddel Hund med relation til test2.doc.
Avatar billede arne_v Ekspert
09. oktober 2012 - 04:14 #9
At skulle huske at goere ting paa en bestemt maade for ikke at lave ulykker er lige netop det som godt database design forsoeger at undgaa.
Avatar billede groyk Novice
23. oktober 2012 - 07:24 #10
Hej igen, undskyld det sene svar.

Misforstod vidst det med den ekstra tabel, det er også sådan db strukturen er bygget op.

Og ja, et tag der "er i brug" må naturligvis ikke kunne tilrettes. Hvis dette skal ændres / slettes skal alle relationer først være fjernet. Ellers er der jo ikke styr på relationerne.

Har desværre ikke haft tid til at færdiggøre "doc" delen af systemet endnu. Men smid lige et svar hver, jeg er sikker på at jeg kan bruge tråden når jeg kommer videre med kodningen.
Avatar billede arne_v Ekspert
25. oktober 2012 - 22:58 #11
svar
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