我在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次查询?
答案 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
我相信。