如何避免在这种情况下做100个查询?
我已经在php/mysql中创建了一个简单的博客,在主页上显示最新的100个帖子,并为每个帖子显示评论的编号。如何避免在这种情况下做100个查询?
这是伪代码:
Mysql query to get latest 100 posts.
While cicle:
Get title and body of each post.
Mysql query to get the comments's number of the post.
数据库结构:
Post:
-id
-title
-body
-date
Comments:
-id
-id_post
-id_user
-body
-date
有没有办法避免100个查询?
你可以写一个SQL查询JOINS你的表一起的两个,返回所有你想要的信息:
SELECT
p.id,
p.title,
p.body,
p.date,
COUNT(c.id)
FROM Post p
LEFT JOIN Comments c ON p.id = C.post_id
GROUP BY p.id, p.title, p.body, p.date
ORDER BY p.date DESC
LIMIT 100
杰夫阿特伍德有great visual guide explaining how joins work。
我们正在按日期顺序选择前100条帖子,计算总评论数(如果它们存在 - 这就是为什么我们使用LEFT JOIN,否则,如果我们使用INNER JOIN,我们将只返回有评论)。
我们GROUP BY因为这是怎么算(和其他聚合功能,如SUM和AVG的工作 - 我们需要告诉他们的规则是什么计数/相加/平均我们行
我们ORDER BY的发布日期,英寸DESCending命令(最新的第一次),以确保我们按照它们的顺序返回帖子
LIMIT 100语句只返回MySql中的前100行,将其更改为您希望的任何数字(前10,50等)如果你想改变摘要中的帖子数量。
总体结果是,您现在有一个结果集,其中包含发布信息和评论数,全部在一个查询中。然后,您可以以您认为合适的方式在Web应用程序中显示这些结果。
加入自己的帖子表与你的讯息,信息表,并在同一时间
select p.id,pi.comments from posts as p, post_info as pi where p.id == pi.id
或类似的东西选择。
编辑:
select p.title,p.body,p.date,count(c.id) from post as p, comments as c where p.id == c.id_post
我相信。
鉴于你的数据库结构:已更新答案 – Meoiswa 2013-05-02 10:03:52
虽然这是一种有效的方法,但它不是一个好的方法。正如其他答案所建议的,MySQL JOIN是更好的解决方案。 – 2013-05-02 10:12:50
只需加入您的表格,然后计算该帖子的评论数量即可。
SELECT p.id, p.title, p.body, COUNT(pc.id) as comments
FROM Post p
LEFT JOIN Comments pc ON (p.id = pc.id_post)
GROUP BY pc.id_post LIMIT 100
希望这就是你所追求的。
假设mysql不存在换行符问题,您是否可以向查询添加一些内容,以便在不滚动的情况下可读? – 2013-05-02 10:06:18
这是一个相当简单的查询:
SELECT p.id, p.title, p.body. p.date, COUNT(c.id) AS comment_count
FROM Post p
LEFT JOIN Comments c ON p.id=c.id_post
GROUP BY p.id, p.title, p.body. p.date
ORDER BY p.id DESC
LIMIT 100
(请注意这是未经测试,把它作为一个起点。)
我知道这是一个普遍的认为,一个数据库无非是看中文件系统和SELECT * FROM data
是你需要知道的所有SQL,但花一些时间学习基本的SQL,这是绝对值得的。
+1对于良好的格式和“阅读”完整的“手动”建议 – Meoiswa 2013-05-02 10:07:36
这可能很容易在SQL语句中使用一个或多个'JOIN'来解决,但是我们需要的信息比您给出的要多得多。请至少告诉我们您正在使用的MySQL语句。然而,数据库结构也是值得的。你也应该把它标记为'php'。 – dunc 2013-05-02 09:58:15
@dunc PHP在这里看起来不相关。 – 2013-05-02 09:58:52
你可以考虑编写一个sql查询来取回前100个帖子的摘要;此摘要将包括帖子ID,帖子标题和每篇帖子的正文,以及评论数量。这可能是一个查询,通过一个'JOIN'在多个表中查询,其结果可以以任何你想要的方式显示。 – dash 2013-05-02 09:59:16