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
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
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 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
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 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
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 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.
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 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
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...
"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 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.
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.