2011-01-25 109 views
0

我正在開發一個PHP論壇。 本論壇使用四個數據庫表:論壇,帖子,帖子,用戶。孫子表的MySQL計數返回不同的結果

在我的着陸頁上,我列出了所有論壇,以及最新線程列表(通過連接和內部連接實現),總體THAS(簡單計數子查詢)和總帖子。

我有一個合理大小的查詢,返回以上所有內容,並且一切工作都很好 - 除了總帖子。

主查詢是這樣的:

select f.id as forum_id, 
f.name as forum_name, 
f.description, 
t.forum_id, 
#this subquery counts total threads in each forum 
(select count(t.forum_id) 
    from thread t 
    where t.forum_id = f.id 
    ) as total_threads, 
#this query counts total posts for each forum 
(SELECT COUNT(p.id) 
    FROM post p 
    WHERE p.thread_id = t.id 
    AND t.forum_id = f.id 
    GROUP BY f.id) as total_posts, 
t.id as thread_id, 
t.name as thread_name, 
t.forum_id as parent_forum, 
t.user_id, 
t.date_created, 
u.id as user_id, 
u.username 
from forum f 
# this join finds all latest threads of each forum 
join 
    (select forum_id, max(date_created) as latest 
    from thread 
    group by forum_id) as d on d.forum_id = f.id 
#and this inner join grabs the rest of the thread table for each latest thread 
inner join thread as t 
on d.forum_id = t.forum_id 
and d.latest = t.date_created 
join user as u on t.user_id = u.id 

所以,如果你將你的注意力總員額子查詢以上 你會發現htat我指望所有職位,他們的線程ID =的ID每個線程然後=每個論壇的ID,如果我單獨使用這個查詢(幷包括主查詢中其他地方使用的表別名)它完美的作品。但是,當用於主查詢的爭用中,並且在別處提供表別名時,它只返回第一個線程p/forum的計數。

如果我嘗試在子查詢中聲明表別名,它將返回多於一行已被返回的錯誤。

爲什麼關於查詢內容的差異以及爲什麼只有第一個線程在主查詢中用作計算字段時才被計算?

回答

0

由於兩個t.forum_id和f.id只相關子查詢外,你的查詢是相同的:

IF(t.forum_id = f.id, 
(SELECT COUNT(p.id) 
FROM post p 
WHERE p.thread_id = t.id 
GROUP BY 1) 
, 0) AS total_posts 

你可能想是這樣的:

SELECT f.name AS forum_name, COUNT(p.id) AS total_posts 
FROM forum AS f 
JOIN thread AS t ON t.forum_id = f.id 
JOIN post AS p ON p.thread_id = t.id 
GROUP BY f.id 

那查詢將返回每個論壇一行,並應正確包括帖子數。

請注意,如果論壇中沒有帖子,則該查詢不會返回該論壇 - 如果您需要注意,可以使用LEFT JOIN而不是JOIN來更改該論壇。