Avatar billede weis Nybegynder
22. juli 2010 - 22:24 Der er 5 kommentarer og
2 løsninger

Select mellem 5 tabeller

Jeg har fem tabeller som jeg skal have kædet sammen i en select stmt (til et view). Det er en kategori tabel som indeholder et id og navn og så fire 'mange til mange' tabeller, strukturen er:

category(int cat_id, varchar name)
tabl1_cat(int cat_id, int tabl1_id)
tabl2_cat(int cat_id, int tabl2_id)
tabl3_cat(int cat_id, int tabl3_id)
tabl4_cat(int cat_id, int tabl4_id)

det jeg så gerne vil ende ud med er en tabel som laver et count på hvor mange rows fx tabl1 har med kategorien 'dyr', så jeg skulle gerne ende med en struktur ala denne:

(int cat_id, varchar name, count(tabl1.cat_id = cat_id), count(tabl1.cat_id = cat_id)

desværre så har alle min joins indtil videre været mislykket, kan nogen hjælpe :)
Avatar billede teepee Nybegynder
23. juli 2010 - 10:00 #1
Nu ved jeg ikke hvorfor at du har fire relationstabeller, men da de er ens i opbygningen kunne du jo starte med at union'ne dem sammen til én tabel

Lidt oracle syntax...

select name, count(*) from category,
(select cat_id, tabl1_id tabl_id, '1' fromtabl from tabl1_cat
union all
select cat_id, tabl2_id tabl_id, '2' fromtabl from tabl2_cat
union all
select cat_id, tabl3_id tabl_id, '3' fromtabl from tabl3_cat
union all
select cat_id, tabl4_id tabl_id, '4' fromtabl from tabl4_cat
) rels
where category.cat_id=rels.cat_id
group by name;
Avatar billede weis Nybegynder
23. juli 2010 - 10:23 #2
grunden til at jeg har fire tabeller, er at kategorierne kan kædes sammen med fx. nyheder, kalender, etc. hvis du har et bedre forslag til design så høre jeg da gerne :)

Desværre så får jeg ikke helt det ønsket resultat af query'en den kommer med et total count og jeg skulle gerne have den delt counten ud på de fire tabeller, så jeg kan se hvor mange af hver kategori der er i de enkelte 'mange-til-mange' tabeller!
Avatar billede teepee Nybegynder
23. juli 2010 - 10:49 #3
så skal du bare tilføje group by name, fromtabl
Avatar billede teepee Nybegynder
23. juli 2010 - 10:50 #4
Sådan her:

select name, fromtabl, count(*)
from category,
(select cat_id, tabl1_id tabl_id, '1' fromtabl from tabl1_cat
union all
select cat_id, tabl2_id tabl_id, '2' fromtabl from tabl2_cat
union all
select cat_id, tabl3_id tabl_id, '3' fromtabl from tabl3_cat
union all
select cat_id, tabl4_id tabl_id, '4' fromtabl from tabl4_cat
) rels
where category.cat_id=rels.cat_id
group by name, fromtabl;
Avatar billede weis Nybegynder
23. juli 2010 - 10:55 #5
så er det fordi syntaxen ikke matcher så godt i mysql!
Avatar billede teepee Nybegynder
23. juli 2010 - 11:11 #6
Fint, du kan bare lave et view der joiner de fire tabeller sammen, med en tredje kolonne der fortæller hvilken tabel det kom fra.
herefter er det bare at joine viewet med din category tabel - i mysql/ansi syntax naturligvis. det finder du nok ud af eller også kommer der måske en kommentar fra en øvet mysql bruger.
Avatar billede weis Nybegynder
23. juli 2010 - 13:43 #7
Fik fundet løsningen det blev:

SELECT cat.cat_id, cat.cat_name, count(tb1.id), count(tb2.id), count(tb3.id), count(tb4.id) FROM category as cat
left join tabl1 as tb1 on cat.cat_id = tb1.cat_id
left join tabl2 as tb2 on cat.cat_id = tb2.cat_id
left join tabl3 as tb3 on cat.cat_id = tb3.cat_id
left join tabl4 as tb4 on cat.cat_id = tb4.cat_id
group by cat.cat_id

så skulle resultaterne gerne komme ud i hver sin column!
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