2009-06-23 79 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是很尴尬,因为它不“合”在一起。

相关问题