webForumDet fria alternativet

Count i forum-db

13 svar · 300 visningar · startad av lolukokasos

lolukokasosMedlem sedan mars 2001196 inlägg
#1

Jag har en forum-db som ser ut så här (endast relevanta fält):

FORUM (a)
-forumId
-heading

THREAD (b)
-threadId
-forumId
-userId

MESSAGE (c)
-messId
-threadId
-userId
-regDateTime

USER (d)
-userId
-nickName

Problemet är när jag vill räkna antalet trådar i ett forum och i sin tur antalet inlägg (messId).
Jag vill alltså ha fram dessa värden i en select-sats:
a.forumId, a.heading, d.nickName, MAX(c.regDateTime),
COUNT(b.threadId), COUNT(c.messId)

Kan nån hjälpa mig då jag inte har fått ihop denna sats.

/Lukas

PS. Jag sitter med Access. DS.

LarsGMedlem sedan dec. 200012 464 inlägg
#2

select count(*) as threads,
          (select count(*) from message
             where threadId = t.threadid) as posts,
          f.forumId,
          f.heading,
          (select nickName from user inner join message
             on user.userid = message.userid
            where regDateTime = (select max(regDateTime) 
             from message where threadid = t.threadid))    ,
          (select max(regDateTime) from message
             where threadid = t.threadid) as regDateTime
  from forum f inner join threads t on f.forumId = t.forumId
 group by f.forumId,f.heading
lolukokasosMedlem sedan mars 2001196 inlägg
#3

små justeringar på kod:

select count(*) as threads,
          (select count(*) from message
             where threadId = t.threadId) as posts,
          f.forumId,
          f.heading,
          (select nickName from user inner join message
             on user.userId = message.userId
            where regDateTime = (select max(regDateTime) 
             from message where threadId = t.threadId))    ,
          (select max(regDateTime) from message
             where threadId = t.threadId) as regDateTime
  from forum f inner join thread t on f.forumId = t.forumId
 group by f.forumId,f.heading

gav fel:
[Microsoft][Drivrutin för ODBC Microsoft Access] Du försökte köra en fråga med en mängdfunktion som inte innehöll det angivna uttrycket 'threadId'.

När man lägger till threadId i group by så blir det ju fel...å ja ser faktiskt inte varför den skulle behöva vara med?

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Jag skruvade lite

select count(*) as threads,
          (select count(*) from message inner join thread
               on message.threadid = thread.threadid
             where thread.forumid = f.forumid) as posts,
          f.forumId,
          f.heading,
          (select nickName from user inner join message
             on user.userId = message.userId
            where regDateTime = (select max(regDateTime) 
             from message where threadId = t.threadId))    ,
          (select max(regDateTime) from message
             where threadId = t.threadId) as regDateTime
  from forum f inner join thread t on f.forumId = t.forumId
 group by f.forumId,f.heading
lolukokasosMedlem sedan mars 2001196 inlägg
#5

LarsG, koden ger fel:
[Microsoft][Drivrutin för ODBC Microsoft Access] Du försökte köra en fråga med en mängdfunktion som inte innehöll det angivna uttrycket 'threadId'.

Om man gör en SQL-debugging så fastnar den på första count(*) vilket jag iofs tycker är konstigt.

Har du/ni nåt mer förslag?

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Lite korttänkt i dag, det är ju samma problem med de andra två skalära selectarna


select count(*) as threads,
          (select count(*) from message inner join thread
               on message.threadid = thread.threadid
             where thread.forumid = f.forumid) as posts,
          f.forumId,
          f.heading,
          (select nickName from user inner join message
             on user.userId = message.userId
            where regDateTime = (select max(regDateTime) 
             from message inner join thread on 
            message.threadid = thread.threadid
          where forumid = f.forumid))    ,
          (select max(regDateTime) from message 
           inner join thread on message.threadid = thread.threadid
             where forumid = f.forumid) as regDateTime
  from forum f inner join thread t on f.forumId = t.forumId
 group by f.forumId,f.heading0
lolukokasosMedlem sedan mars 2001196 inlägg
#7

Efter att ha ändrat lite kod pga att det finns regDateTime i båda tabellerna i FROM så ser den ut så här:

select count(*) as threads,
          (select count(*) from message inner join thread
               on message.threadId = thread.threadId
             where thread.forumId = f.forumId) as posts,
          f.forumId,
          f.heading,
          (select nickName from user inner join message
             on user.userId = message.userId
            where message.regDateTime = (select max(message.regDateTime) 
             from message inner join thread on 
            message.threadid = thread.threadid
          where forumid = f.forumid))    ,
          (select max(message.regDateTime) from message 
           inner join thread on message.threadid = thread.threadid
             where forumid = f.forumid) as regDate
  from forum f inner join thread t on f.forumId = t.forumId
 group by f.forumId,f.heading

men nu ger det felet:
Microsoft][Drivrutin för ODBC Microsoft Access] Ogiltig åtgärd.

Man undrar lite vad detta kan bero på...tacksam för svar/svaren?!

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Aj då. Det kan ju hända att det är för komplext för Access. Kan du testa med att ta bort några av uttrycken i select-listan? Då kanske du kan lokalisera vilket det är som ställer till det.

lolukokasosMedlem sedan mars 2001196 inlägg
#9

När jag plockade bort andra selectvärdet så funkade den alltså bör det vara nåt fel med den.

(select count(*) from message inner join thread
on message.threadId = thread.threadId
where thread.forumId = f.forumId) as posts

Men det är som vanligt att jag inte ser vad som är fel...

LarsGMedlem sedan dec. 200012 464 inlägg
#10

Jag ser inget konstigt i den frågan.

Om du testar den biten så här då

select 1 , (select count(*) from message inner join thread 
on message.threadId = thread.threadId 
where thread.forumId = f.forumId) as posts 
from forum f

Om det går bra så tyder det på att det är något skumt i Access

lolukokasosMedlem sedan mars 2001196 inlägg
#11

funker icke, som dom säger ;-)

Det är nåt lurt med den delen... fast det funkar om man tar bort vilkoret (efter where). Men då blir å andra sidan inte resultatet riktigt vad gäller antalet inlägg...

lolukokasosMedlem sedan mars 2001196 inlägg
#12

"Rätt" (fungerande) kod ser ut så här:

select count(*) as threads,
          (select count(messId) from message inner join thread
               on message.threadId = thread.threadId
             where thread.forumId = f.forumId) as posts,
          f.forumId,
          f.heading,
          (select nickName from user inner join message
             on user.userId = message.userId
            where message.regDateTime = (select max(message.regDateTime) 
             from message inner join thread on 
            message.threadid = thread.threadid
          where forumid = f.forumid))    ,
          (select max(message.regDateTime) from message 
           inner join thread on message.threadid = thread.threadid
             where forumid = f.forumid) as regDate
  from forum f inner join thread t on f.forumId = t.forumId
 group by f.forumId,f.heading

Skillnaden är alltså COUNT(messId) vs COUNT(*), någon med kunskap kanske kan förklara logiken bakom det.

LarsGMedlem sedan dec. 200012 464 inlägg
#13

Nej, jag förstår inte att det skulle ha någon betydelse för att frågan skall gå att utföra eller inte. Enda skillnaden mellan count(*) och count(column) är att den senare inte tar med de poster där kolumnen är null.

För mig ser det ut som ett fel i Access.

lolukokasosMedlem sedan mars 2001196 inlägg
#14

För mig ser det ut som ett fel i Access.

Jag skulle vilja hålla med dig men jag har testat i både 2000 och 97 med samma resultat så det finns nog nån tanke bakom det.

137 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)