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.
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
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?
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.
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?!
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.
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
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...
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.
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.