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

问题描述

我的目标是获得特定用户所有帖子的“待处理”和“批准”评论总数。注释表的状态列为“待定”或“已批准”。作为记录,注释表中的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();

要使表格结构更清晰可见,下面是表格列。

评论

comments table

帖子表

posts table

用户

users table

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

我将继续尝试执行此操作-但-需要一些有关如何实现此功能的指南。

编辑:

我有一个用于用户管理面板。我想创建一个批准的评论表,其顶部的批准评论数,以及一个待处理的评论表,其顶部的待审评论数。每个表格中都有一个按钮,用于批准或不批准评论-但仅适用于他们的帖子。这是我如何对所有评论执行此操作的图像。

example usage

解决方法

似乎使用SUMCASE进行了非常简单的查询

SELECT
  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 pendingCount
FROM comments c
INNER JOIN posts p
  ON c.page_id = p.id
WHERE p.user_id = :user_id

此查询的主要作用是将所有comments行与status = 'approved'和另外status = 'pending'行作为两个单独的计数相加。

如果您要查找的COALESCE没有匹配的记录,则可以使用user_id函数。如果不使用它们,结果将是null而不是0

,

对于填充每个页面的问题的第一部分,通过在包含两个表的内部联接上使用“ SELECT * FROM”,从POSTS中检索ID和从COMMENTS中检索ID。在这种情况下,将返回POSTS和COMMENTS中具有相同名称(id,img)的列,并且结果将是不明确的,即在PHP代码中,当您要求$ row-> id时,它将是POSTS.ID还是COMMENTS.ID?

您需要COMMENTS.ID来更新COMMENTS中的状态。您可以将“ COMMENTS.ID重命名为COMMENT_ID”,或者仅在知道返回的“ ID”将为COMMENT.ID的情况下从COMMENTS中选择

由于您只希望结果中包含来自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是唯一的。
  • 您不会返回那么多行以进行分页...限制查询需要一种不同的方法。