2013-05-02 103 views
1

我已经在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个查询?

+2

这可能很容易在SQL语句中使用一个或多个'JOIN'来解决,但是我们需要的信息比您给出的要多得多。请至少告诉我们您正在使用的MySQL语句。然而,数据库结构也是值得的。你也应该把它标记为'php'。 – dunc 2013-05-02 09:58:15

+0

@dunc PHP在这里看起来不相关。 – 2013-05-02 09:58:52

+0

你可以考虑编写一个sql查询来取回前100个帖子的摘要;此摘要将包括帖子ID,帖子标题和每篇帖子的正文,以及评论数量。这可能是一个查询,通过一个'JOIN'在多个表中查询,其结果可以以任何你想要的方式显示。 – dash 2013-05-02 09:59:16

回答

3

你可以写一个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应用程序中显示这些结果。

-2

加入自己的帖子表与你的讯息,信息表,并在同一时间

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

我相信。

+0

鉴于你的数据库结构:已更新答案 – Meoiswa 2013-05-02 10:03:52

+0

虽然这是一种有效的方法,但它不是一个好的方法。正如其他答案所建议的,MySQL JOIN是更好的解决方案。 – 2013-05-02 10:12:50

2

只需加入您的表格,然后计算该帖子的评论数量即可。

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 

希望这就是你所追求的。

+1

假设mysql不存在换行符问题,您是否可以向查询添加一些内容,以便在不滚动的情况下可读? – 2013-05-02 10:06:18

6

这是一个相当简单的查询:

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,这是绝对值得的。

+0

+1对于良好的格式和“阅读”完整的“手动”建议 – Meoiswa 2013-05-02 10:07:36

相关问题