webForumDet fria alternativet

Group BY i dubbel join

ASP

8 svar · 268 visningar · startad av Jörgen HP

Medlem sedan feb. 20012 412 inlägg
Frågan#1

Hej!

Vill gruppera följande, men den vill ej grupperas:


strSQL ="SELECT Categorier.IntForumId, Categorier.ForumName, Categorier.ForumUse, Categorier.ForumThreads, " & _
"Categorier.ForumPosts, Inlagg.dteDate, Svar.Svar_dteDate, Categorier.ForumModerator FROM b1180.Categorier " & _
"INNER JOIN b1180.Inlagg ON " & _
"Categorier.IntForumId = Inlagg.Categori_Id " & _
"INNER JOIN b1180.Svar ON Inlagg.Categori_Id = Svar_ForumId " & _
"GROUP BY Categorier.ForumName"

Den fungerar bra i övrigt, jag har kanske klantat någonstans? :q

mvh Jörgen

------------------
*** Var går gränsen mellan långa kortbyxor och korta långbyxor? ***

Medlem sedan dec. 200012 464 inlägg
#2

Vad vill du uppnå? Vad menar du med att det inte fungerar?

Det står i Mysql-manualen att om man använder group by på det sättet så kan det ge oväntade resultat. Det är inte standard att skriva så där.

------------------
essentitia preter non sans multiplicandum

Medlem sedan feb. 20012 412 inlägg
#3

Hej!

Jag vill hämta:

IntForumId,ForumName,ForumUse,ForumThreads,ForumPosts, ForumModerator från tabellen Categorier

dteDate från tabellen inlägg

Svar_dteDate från tabellen svar

Sedan loopar jag recsetet så ja får något i stil med:

Forum | Trådar | Inlägg | Senaste inlägg | Modeartor

Första Forumet | 96 | 234 | 2001-08-12 | Kalle

Andra Forumet | 116 | 576 | 2001-08-14 | Hugo

Tredje Forumet | 12 | 21 | 2001-08-15 | Hobbe

Den skriver i nuvarande stund ut alla uppgifter men bara det forumet som har ForumId 3. De forumen som har forumId 2 eller 1 skrivs inte ut. Så resultatet är nu:

Tredje Forumet | 12 | 21 | 2001-08-15 | Hobbe

istället för:

Första Forumet | 96 | 234 | 2001-08-12 | Kalle

Andra Forumet | 116 | 576 | 2001-08-14 | Hugo

Tredje Forumet | 12 | 21 | 2001-08-15 | Hobbe

Så som det ser ut nu är jag glad om det funkar, kan inga standarder :(

Hajar ni?

Mvh Jörgen

------------------
*** Var går gränsen mellan långa kortbyxor och korta långbyxor? ***

[Redigerat av jorgen den 16 aug 2001]

Medlem sedan dec. 200012 464 inlägg
#4

Att du bara får fram poster för forumid 3 beror inte på group by utan mer på att det inte blir någon match i ditt join-villkor.

Använder du rätt kolumner i ditt join-villkor? Jag tycker att det ser konstigt ut då du har inlagg.categori_id med i båda on-klausulerna.

Sen så behöver du nog en outer join mellan inlägg och svar då det kan finnas inlägg som inte har några svar.

Om jag förstår din datamodell rätt så borde själva group by biten se ut

SELECT Categorier.IntForumId, Categorier.ForumName, Categorier.ForumUse, Categorier.ForumThreads, 
Categorier.ForumPosts, Inlagg.dteDate, max(Svar.Svar_dteDate) as svar_dteDate, Categorier.ForumModerator 
...
group by Categorier.IntForumId, Categorier.ForumName, Categorier.ForumUse, Categorier.ForumThreads,
Categorier.ForumPosts, Inlagg.dteDate, 
Categorier.ForumModerator

------------------
essentitia preter non sans multiplicandum

Medlem sedan feb. 20012 412 inlägg
#5

Hej!

Jag har relation mellan tabellerna med hjälp av ForumId, Joiner följer mänster:


SELECT * FROM Table1 INNER JOIN table2 ON tabell1.fält = tabell2.fält
 INNER JOIN Table3 ON tabell2.fält2 = Table3.fält

tabell2.fält2. vadå fält 2 jag har bara 1 forumid i varje tabell.

outer join :q
Hur myglar man in den i sammanhanget?

mvh Jörgen

------------------
*** Var går gränsen mellan långa kortbyxor och korta långbyxor? ***

[Redigerat av jorgen den 17 aug 2001]

Medlem sedan dec. 200012 464 inlägg
#6

Jag måste ha en beskrivning av din datamdodell. Är det den som PatrikB föreslog i ett tidigare inlägg?

Outer join:


select * from a left outer join b
  on a.id = b.id

innebär att man får alla rader från den vänstra tabellen (a) oavsett om det finns matchande rader i den högra tabellen (b).

------------------
essentitia preter non sans multiplicandum

Medlem sedan feb. 20012 412 inlägg
#7

Okey, tack larsg, då vet jag hur en left outer join fungerar. :e

Mina tabeller ser ut enligt nedan:


Tabell Categorier:

IntForumId
ForumUse
ForumName
ForumModerator

Tabell Inlagg:

MessId
Subject  
Comment
dteDate
AnvId  
Catogori_Id 

Tabell svar:

Svar_Id
Svar_Comment
Svar_MessId
Svar_ForumId
Svar_AnvId
Svar_dteDate

Relation mellan alla tabeller med Svar_ForumId, Catogori_Id, IntForumId

Relation mellan Svar och Inlagg

Svar_MessId, MessId

vänligen Jörgen

------------------
*** Var går gränsen mellan långa kortbyxor och korta långbyxor? ***

[Redigerat av jorgen den 17 aug 2001]

Medlem sedan feb. 20012 412 inlägg
#8

Hej!

Hittade en fungerande version, nu ska jag bara fixa till maxdatum också.

lägger ut så kanske det hjälper någon annan också.


strSQL ="SELECT Categorier.*, Inlagg.dteDate," & _
" Svar.Svar_dteDate, Inlagg.dteDate " & _
 
"FROM " & _

"b1180.Categorier LEFT JOIN b1180.Inlagg " & _
"ON Inlagg.IntForumId = Categorier.IntForumId " & _

"LEFT JOIN " & _

"b1180.Svar ON Inlagg.IntForumId = Svar.IntForumId  " & _
"group by Categorier.IntForumId "

mvh Jörgen

------------------
*** Var går gränsen mellan långa kortbyxor och korta långbyxor? ***

Medlem sedan dec. 200012 464 inlägg
#9
SELECT C.ForumName, max (case when I.dteDate > S.Svar_dteDate then 
                         I.dteDate else s.svar_dteDate end) as dteDate,
       count(distinct messid) as threads,
       count(*) as total, c.forummoderator
                             
 FROM b1180.Categorier as c LEFT JOIN b1180.inlagg as i
   ON i.categori_id = C.IntForumId 
   LEFT JOIN b1180.svar as s
   ON I.messid = S.svar_messid 
 group by C.ForumName, c.forummoderator

med reservation för att det inte är uttestat med Mysql.

------------------
essentitia preter non sans multiplicandum

266 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)