在这种情况下如何避免做100次查询?

时间:2013-05-02 09:55:56

标签: php mysql

我在php / mysql中创建了一个简单的博客,在主页上显示最新的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次查询?

4 个答案:

答案 0 :(得分: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,这绝对是值得的。

答案 1 :(得分:3)

您可以编写一个JOINS两个表一起的SQL查询,以返回您想要的所有信息:

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就像COUNT(以及SUM和AVG等其他聚合函数的工作方式 - 我们需要告诉他们计算/求和/平均行的规则是什么。

我们ORDER BY发布日期,以DESCending顺序(最新的第一个)确保我们按照订单的顺序返回帖子。

LIMIT 100语句只返回MySql中的前100行。如果您想改变摘要中的帖子数量,请将其更改为您希望的任何数字(前10名,前50名等)。

总体结果是,您现在拥有一个结果集,其中包含一个查询中的发布信息和注释数。然后,您可以以您认为合适的方式在Web应用程序中显示这些结果。

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

希望你就是这样。

答案 3 :(得分:-2)

使用posts-info表加入你的帖子表,并同时选择它们

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

我相信。