Avatar billede ha9953 Nybegynder
18. juli 2004 - 18:38 Der er 18 kommentarer og
1 løsning

GROUP by når der hentes fra flere tabeller?

Jeg har følgende tabeller:

Nyhed (nyhedid,nyheddatotid,nyhedoverskrift,nyhedresume,nyhedindhold,nyhedantal,brugerid,seasonid,
nyhedsynlig)

nyhed_gruppe
(nyhedid,gruppeid)

nyhed_kategori
(nyhedid,kategoriid)

Kategori
(katid,katnavn,katnavneng,katbeskrivelse,katbeskrivelseeng,katsynlig,kattypeid)

Gruppe
(gruppeid,gruppenavn,gruppebeskrivelse,gruppesynlig,sprogid)

Nyheden kan tilhøre flere gruppe og flere kategorier.

Jeg skal nu have udtrukket følgende:

- Alle nyheder fra en bestemt gruppe
- Nyheden,gruppen og kategorien er sat til synlig
- Kategorierne skal være forskellig fra en bestemt kategori.
- nyheden skal sorteres efter den sidste dato først
-for at begrænse mængden af data skal der kun hentes nyhedid,seasonid,nyhedsynlig,nyheddatotid,nyhedoverskrift samt nyhedresume fra nyheder.

Nedenstående SQL sætning henter fint de rigtige nyheder ud (ikke den bedste sql sætning – ved det), men hvis en nyhed tilhøre flere kategorier, bliver den udskrevet 2 fange – HVORDAN UNDGÅR JEG DET? – nyhederne skal på en eller anden måde grouperes efter nyhedid?


SELECT TOP 3 nyhed.nyhedid,nyhed.seasonid,nyhed.nyhedsynlig,nyhed.nyheddatotid,nyhed.nyhedoverskrift,nyhed.nyhedresume,nyhed_gruppe.*,gruppe.*,nyhed_kategori.*,kategori.* FROM nyhed,nyhed_gruppe,gruppe,nyhed_kategori,kategori WHERE nyhed.nyhedid = nyhed_gruppe.nyhedid AND nyhed_gruppe.gruppeid = gruppe.gruppeid AND nyhed.nyhedid = nyhed_kategori.nyhedid AND nyhed_kategori.katid = kategori.katid AND nyhed.nyhedsynlig=1 AND gruppe.gruppesynlig=1 AND kategori.katsynlig=1 AND gruppe.gruppeid=1 AND kategori.katid<>64 AND kategori.katid<>71 ORDER BY nyheddatotid DESC ;
Avatar billede arne_v Ekspert
18. juli 2004 - 18:41 #1
Du kan ikke bare bruge DISTINCT ?
Avatar billede michel4700 Nybegynder
18. juli 2004 - 18:41 #2
tja dumt spørgmål men hvorn opretter jeg et spørgsmål :oP
Avatar billede arne_v Ekspert
18. juli 2004 - 18:42 #3
Du klikker på "opret spørgsmål" oppe i menuen.
Avatar billede michel4700 Nybegynder
18. juli 2004 - 18:43 #4
Spørgsmål & Svar Artikler Priser C.V. Butikken IDG eller hvor hehe er ny her
Avatar billede cpufan Juniormester
18. juli 2004 - 18:43 #5
hvad med select distinct top 3
Avatar billede cpufan Juniormester
18. juli 2004 - 18:45 #6
nå, det var jo ligesom blevet nævnt inden jeg fik læst og skrevet færdigt :)
Avatar billede arne_v Ekspert
18. juli 2004 - 18:45 #7
michel>

Menuen nedenunder
Avatar billede ha9953 Nybegynder
18. juli 2004 - 18:52 #8
distinct hjalp desværre ikke -skriver stadig flere ud af den samme nyhed, hvis den er tildelt flere kategorier
Avatar billede tonnybrandt Nybegynder
18. juli 2004 - 19:27 #9
Jeg er ikke sql haj, men den select er da ikke komplet ??

Der mangler da noget som vi ikke kan se. Prøv lige at ombryde teksten så hele select-teksten er synlig.
Avatar billede ha9953 Nybegynder
18. juli 2004 - 19:28 #10
Den er komplet "SELECT TOP 3 nyhed.nyhedid,nyhed.seasonid,nyhed.nyhedsynlig,nyhed.nyheddatotid,nyhed.nyhedoverskrift,nyhed.nyhedresume,nyhed_gruppe.*,gruppe.*,nyhed_kategori.*,kategori.* FROM nyhed,nyhed_gruppe,gruppe,nyhed_kategori,kategori WHERE nyhed.nyhedid = nyhed_gruppe.nyhedid AND nyhed_gruppe.gruppeid = gruppe.gruppeid AND nyhed.nyhedid = nyhed_kategori.nyhedid AND nyhed_kategori.katid = kategori.katid AND nyhed.nyhedsynlig=1 AND gruppe.gruppesynlig=1 AND kategori.katsynlig=1 AND gruppe.gruppeid=1 AND kategori.katid<>64 AND kategori.katid<>71 ORDER BY nyheddatotid DESC ;"
Avatar billede tonnybrandt Nybegynder
18. juli 2004 - 19:29 #11
nyhed_  ???????
Avatar billede ha9953 Nybegynder
18. juli 2004 - 19:32 #12
ups sorry:

SELECT TOP 3
nyhed.nyhedid, nyhed.seasonid, nyhed.nyhedsynlig, nyhed.nyheddatotid, nyhed.nyhedoverskrift, nyhed.nyhedresume, nyhed_gruppe.*, gruppe.*, nyhed_kategori.*,kategori.*
FROM nyhed,nyhed_gruppe,gruppe,nyhed_kategori,kategori
WHERE nyhed.nyhedid = nyhed_gruppe.nyhedid
AND nyhed_gruppe.gruppeid = gruppe.gruppeid
AND nyhed.nyhedid = nyhed_kategori.nyhedid
AND nyhed_kategori.katid = kategori.katid
AND nyhed.nyhedsynlig=1
AND gruppe.gruppesynlig=1
AND kategori.katsynlig=1
AND gruppe.gruppeid=1
AND kategori.katid<>64
AND kategori.katid<>71
ORDER BY nyheddatotid DESC ;
Avatar billede tonnybrandt Nybegynder
18. juli 2004 - 19:33 #13
Du vælger nogle flere felter og disse kan ikke ses fordi den linie er for lang og bliver klippet i stykker.

Denne linie:
.......,nyhed.nyhedoverskrift,nyhed.nyhedresume,nyhed_

Den kan ikke slutte sådan.
Avatar billede ha9953 Nybegynder
18. juli 2004 - 19:34 #14
se ovenstående
Avatar billede tonnybrandt Nybegynder
18. juli 2004 - 19:38 #15
Ok, der tror jeg du har fejlen. Du vælger nyhed_kategori.* og kategori.*
Så skal den vel også give 2 stk nyhed_id da nyheden står 2 gange i nyhed_kategori.*
lader du være med at vælge felterne men kun bruger dem i "where" sætningene, kan du smide et distinct ind. F.eks:

SELECT TOP 3
distinct nyhed.nyhedid, nyhed.seasonid, nyhed.nyhedsynlig, nyhed.nyheddatotid, nyhed.nyhedoverskrift, nyhed.nyhedresume, nyhed_gruppe.*, gruppe.*
FROM nyhed,nyhed_gruppe,gruppe,nyhed_kategori,kategori
WHERE nyhed.nyhedid = nyhed_gruppe.nyhedid
AND nyhed_gruppe.gruppeid = gruppe.gruppeid
AND nyhed.nyhedid = nyhed_kategori.nyhedid
AND nyhed_kategori.katid = kategori.katid
AND nyhed.nyhedsynlig=1
AND gruppe.gruppesynlig=1
AND kategori.katsynlig=1
AND gruppe.gruppeid=1
AND kategori.katid<>64
AND kategori.katid<>71
ORDER BY nyheddatotid DESC ;

Tror jeg !!!. Som sagt er jeg ikke haj.
Avatar billede tonnybrandt Nybegynder
18. juli 2004 - 19:40 #16
Muligvis er der det samme problem med gruppen.
Avatar billede ha9953 Nybegynder
18. juli 2004 - 19:44 #17
Ok - fik lige entreprise mangaer til at grouppere for mig :-) - den kom ud med følgende:

SELECT TOP 3 nyhed.nyhedid, nyhed.seasonid, nyhed.nyhedsynlig, nyhed.nyheddatotid,
nyhed.nyhedoverskrift, nyhed.nyhedresume FROM nyhed INNER JOIN nyhed_gruppe ON
nyhed.nyhedid = nyhed_gruppe.nyhedid INNER JOIN gruppe ON nyhed_gruppe.gruppeid =
gruppe.gruppeid INNER JOIN nyhed_kategori ON nyhed.nyhedid = nyhed_kategori.nyhedid
INNER JOIN kategori ON nyhed_kategori.katid = kategori.katid WHERE
(gruppe.gruppesynlig = 1) AND (kategori.katsynlig = 1) AND (gruppe.gruppeid = 1) AND
(kategori.katid <> 64) AND (kategori.katid <> 71) GROUP BY nyhed.nyhedid,
nyhed.seasonid, nyhed.nyhedsynlig, nyhed.nyheddatotid, nyhed.nyhedoverskrift,
nyhed.nyhedresume HAVING (nyhed.nyhedsynlig = 1) ORDER BY nyhed.nyheddatotid DESC;


Men du får ponitne - du hjalp på vej - smid lige et svar tonnybrandt :-)
Avatar billede tonnybrandt Nybegynder
18. juli 2004 - 19:46 #18
Det kommer her *s*
Avatar billede tonnybrandt Nybegynder
18. juli 2004 - 20:03 #19
Takker for point :)
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