猿问

PHP MySQL - 获取一个用户撰写的所有帖子的评论计数

我的目标是获取特定用户所有帖子的“待处理”和“已批准”评论总数。评论表有一个“待处理”或“已批准”状态列。作为记录,comments 表中的 page_id 映射到 posts 表中的 id。


我开始写下面的声明 - 但我想我已经把它放回到前面了:


 $sql = 'SELECT * FROM posts JOIN comments on posts.id = comments.page_id WHERE author = posts.author';

 $stmt = $pdo->prepare($sql);

 $stmt->execute();

 $results = $stmt->fetch();

为了使表结构可见,下面是表列。


评论表 

帖子表 

https://img1.sycdn.imooc.com/652b94b00001160a23040052.jpg

用户表

https://img1.sycdn.imooc.com/652b94be000145c325500050.jpg

我有一个将用户id与帖子关联起来的外键user_id

我将继续尝试这样做 - 但是 - 希望获得一些关于如何实现这项工作的指导。

编辑:

我有一个供用户使用的管理面板。我想创建一个已批准评论表,其中已批准评论计数位于顶部,以及一个待处理评论表,其中待处理评论计数位于顶部。每个表格中都有一个按钮可以批准或取消批准评论 - 但仅限于他们的帖子。这是我如何针对所有评论执行此操作的图片。

https://img1.sycdn.imooc.com/652b94cb0001dc0225280550.jpg

慕虎7371278
浏览 123回答 2
2回答

慕神8447489

SUM使用and似乎是一个非常简单的查询CASESELECT  COALESCE(SUM(CASE WHEN c.status = 'approved' THEN 1 ELSE 0 END), 0) AS approvedCount,  COALESCE(SUM(CASE WHEN c.status = 'pending' THEN 1 ELSE 0 END), 0) AS pendingCountFROM comments cINNER JOIN posts p  ON c.page_id = p.idWHERE p.user_id = :user_id该查询的主要作用是将所有行comments与status = 'approved'另一个status = 'pending'单独的计数相加。当您要查找的记录没有匹配记录时,这些COALESCE功能可以满足您的需求。user_id如果不使用它们,结果将null不是0。

慕运维8079593

对于填充每个页面的问题的第一部分,您可以通过在包含两个表的内部联接上使用“SELECT * FROM”从 POSTS 检索 ID 并从 COMMENTS 检索 ID。在这种情况下,将返回 POSTS 和 COMMENTS 中具有相同名称(id、img)的列,并且结果将不明确,即在 PHP 代码中,当您请求 $row->id 时,它是 POSTS.ID 还是评论.ID?您需要 COMMENTS.ID 来更新 COMMENTS 中的状态。您可以将“COMMENTS.ID 重命名为 COMMENT_ID”,或者仅从 COMMENTS 中进行选择,因为您知道返回的“ID”将是 COMMENT.ID由于您只需要结果中来自 COMMENTS 的行,因此我只会从 COMMENTS 中进行选择,并使用子查询通过 POSTS 而不是联接来约束它,并且还进一步将 SELECT 限制为您的结果明确需要的列列表,以便您不必为返回不需要的列付费,例如SELECT C.ID, C.NAME, C.CONTENT, C.VOTES C.STATUS /* but you know that STATUS already, heheh */FROM COMMENTS C WHERE   C.STATUS = :STATUS AND  C.PAGE_ID IN ( SELECT P.ID FROM POSTS P WHERE P.USER_ID = :USER )有用的索引:对 STATUS、PAGE_ID 的评论USER_ID 上的帖子假设:COMMENTS.PAGE_ID --> POSTS.ID 外键依赖。POSTS.ID 和 COMMENTS.ID 是唯一的。您不会返回太多需要分页的行...限制查询需要不同的方法。
随时随地看视频慕课网APP
我要回答