2012-11-30 131 views
0

我的論壇的索引頁看起來是這樣的:MySQL:如何加快這個查詢(包括子查詢)?

| Forum | Topics | Answers | 
---------------------------- 
| Forum A | 123 | 45678 | 
| Forum B | 345 | 23128 | 
| Forum C | 567 | 2328 | 

這裏是我的SQL代碼,到目前爲止的作品,但我認爲必須有一個更好的解決方案:

SELECT f.`id`, f.`name`, f.`description`, f.`type`, 

     (SELECT COUNT(`id`) 
     FROM threads 
     WHERE `forum_id` = f.`id`) AS num_threads, 

     (SELECT COUNT(p.`id`) 
     FROM threads t, posts p 
     WHERE p.thread_id = t.id 
      AND t.forum_id = f.id) AS num_posts 

    FROM `forums` f ORDER BY `position` 

你將如何加快這個查詢?子查詢的任何替代方法?

在此先感謝!

回答

1

事情是這樣的,在加入基本選擇與條款一對夫妻帶着一羣子查詢(所以他們執行一次每個,而不是各一次,每行)

SELECT f.id, f.name, f.description, f.type, tc.RowCnt, ta.RowCnt 
    FROM `forums` f 
    INNER JOIN (SELECT forum_id, COUNT(id) AS RowCnt FROM threads GROUP BY forum_id) tc 
    INNER JOIN (SELECT forum_id, COUNT(p.id) AS RowCnt FROM threads t INNER JOIN posts p ON p.thread_id = t.id GROUP BY forum_id) ta 
    ORDER BY position 

你可能會做改進這個在主要選擇而不是次選(但它是晚間星期五,我累了!)的計數之一。

+0

感謝您的回答,但它不起作用 - 錯誤:#1054 - '字段列表'中的未知列'tc.RowCnt' –

+1

哎呀,忘了在別名中放置別名 – Kickstart

2

瞭解SQL joinsGROUP BY

SELECT f.id, f.name, f.description, f.type, 
     COUNT(DISTINCT t.id) AS num_threads, 
     COUNT(*) AS num_posts 
FROM  forums f 
    JOIN threads t ON t.forum_id = f.id 
    JOIN posts p ON p.thread_id = t.id 
GROUP BY f.id 
ORDER BY f.position 

此外,確保您有以下指標:

  • (id)forums
  • (id, forum_id)threads
  • (thread_id)posts

(如果您創建了foreign key contraints,MySQL將要求您擁有這些索引)。

+0

感謝您的回覆!索引存在,但您的代碼無法正常工作。我只是得到了一個結果,但我認爲你的SQL沒有限制。 –