1

我在 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

4 回答 4

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 绝对值得付出努力。

于 2013-05-02T10:05:18.413 回答
3

您可以编写一个将两个表连接在一起的 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

Jeff Atwood 有一个很棒的视觉指南来解释连接是如何工作的。

我们有效地按日期顺序选择前 100 个帖子,计算总评论数(如果它们存在 - 这就是我们使用 LEFT JOIN 的原因,否则,如果我们使用 INNER JOIN,我们将只返回有评论的帖子)。

我们GROUP BY因为这就是 COUNT(以及 SUM 和 AVG 等其他聚合函数的工作方式 - 我们需要告诉他们计算/求和/平均我们的行的规则是什么。

我们在发布日期前订购,以DESCending顺序(最新的在前),以确保我们按照发布的顺序返回帖子。

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

总体结果是您现在拥有一个包含帖子信息和评论数量的结果集,所有这些都在一个查询中。然后,您可以以任何您认为合适的方式在您的 Web 应用程序中显示这些结果。

于 2013-05-02T10:06:20.073 回答
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

希望这就是你所追求的。

于 2013-05-02T10:04:22.983 回答
-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

我相信。

于 2013-05-02T09:59:38.460 回答