问题描述
我的目标是获得特定用户所有帖子的“待处理”和“批准”评论总数。注释表的状态列为“待定”或“已批准”。作为记录,注释表中的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();
要使表格结构更清晰可见,下面是表格列。
评论表
用户表
我将继续尝试执行此操作-但-需要一些有关如何实现此功能的指南。
编辑:
我有一个用于用户的管理面板。我想创建一个批准的评论表,其顶部的批准评论数,以及一个待处理的评论表,其顶部的待审评论数。每个表格中都有一个按钮,用于批准或不批准评论-但仅适用于他们的帖子。这是我如何对所有评论执行此操作的图像。
解决方法
似乎使用SUM
和CASE
进行了非常简单的查询
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是唯一的。
- 您不会返回那么多行以进行分页...限制查询需要一种不同的方法。