2009-06-23 60 views
0

這裏是情況,每個頁面將顯示30個主題,所以我至少執行了1個sql語句,此外,我還想顯示每個主題有多少個relpies以及作者是誰,因此我必須用30條語句來計算replpies的數量,並使用其他30條語句來找到作者。最後,我得到了61條陳述,我真的擔心效率問題。在我的情況下減少sql查詢的最佳方法是什麼

我的表是這樣的:

 
Topic   Reply   User 
-------  ----------  ------------ 
id   id    id 
title   topic_id   username 
...   ...    
author_id 

回答

2

你應該考慮在查詢過程中連接表。

加入作爲一個例子加盟,我可以做到以下幾點:

SELECT reply.id, reply.authorid, reply.text, reply.topicid, 
     topic.title, 
     user.username 
FROM reply 
    LEFT JOIN topic ON (topic.id = reply.topicid) 
    LEFT JOIN user ON (user.id = reply.authorid) 
WHERE (reply.isactive = 1) 
ORDER BY reply.postdate DESC 
LIMIT 10 
2

如果我正確地讀出你的要求,你想要的以下查詢的結果:

SELECT Topic.title, User.username, COUNT(Reply.topic_id) Replies 
FROM Topic, User, Reply 
WHERE Topic.id = Reply.topic_id 
AND Topic.author_id = User.id 
GROUP BY Topic.title, User.username 
+0

+1擊敗了我。 – 2009-06-23 02:04:13

0

你當然可以在這個上使用一些「左連接」,但是由於輸出只有在有人更新/添加到表時纔會改變,你可以嘗試將它緩存在xml /文本文件中。另一種方式可以通過在主題表中添加另一行來保留回覆計數,用戶名等,並且只有在發生更改時才更新它們...

1

當我第一次開始使用數據庫時驅動的Web應用程序我有類似的問題。然後我花了數年時間在一個數據庫豐富的環境中工作,在那裏我真正學習了SQL如果您打算繼續開發Web應用程序(我發現這些應用程序非常有趣),那麼花些時間拿起一本書或查看一些關於基本和高級SQL的操作方法是值得的。

1

有一點要補充,上邊的JOINS

這可能是因爲您的數據組不匹配或相關,所以JOIN的將無法工作。另一種方式:你可能有2個主要的數據塊加入尷尬。

存儲過程可以返回多個結果集。

例如,對於摘要頁面,您可以在一次SQL調用中返回一個聚合結果集和另一個「最後20個」結果集。要加入2是很尷尬,因爲它不「合」在一起。

相關問題