在我的情况下减少SQL查询的最佳方法是什么

时间:2009-06-23 01:57:34

标签: sql database web-applications join

在这种情况下,每个页面将显示30个主题,所以我至少执行了1个sql语句,此外,我还想显示每个主题有多少重复,以及作者是谁,因此 我必须使用30个语句来计算replpies的数量,并使用其他30个语句来查找作者。最后,我得到了61个语句,我真的担心效率。

我的表格如下:

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:1)

当我第一次开始使用数据库驱动的Web应用程序时,我遇到了类似的问题。然后我花了几年时间在数据库丰富的环境中工作,实际上我学习了SQL。如果您打算继续开发Web应用程序(我觉得这些应用程序非常有趣),那么值得您花时间学习一本书或查看基本和高级SQL的一些操作方法。

答案 3 :(得分:1)

在JOINS之上添加一件事

可能是您的数据组不匹配或无关,因此JOIN不起作用。另一种方式:你可能有2个主要的数据块,这些数据很难加入。

存储过程可以返回多个结果集。

例如,对于摘要页面,您可以在一次SQL调用中返回一个聚合结果集和另一个“最后20”结果集。加入2是很尴尬的,因为它不能“适合”在一起。

答案 4 :(得分:0)

你当然可以在这个上使用一些“左连接”,但是因为输出只有在有人更新/添加到你的表时你才会尝试将它缓存在xml / text文件中。另一种方法是通过在主题表中添加另一行来保留回复计数,用户名等来构建一些冗余...并且仅在发生更改时更新它们...