如何统计按用户名+邮箱分组的所有评论数量(SQL)
按用户名+邮箱分组统计WordPress评论数
现有评论表结构及数据
| comment_ID | comment_author | comment_author_email |
|---|---|---|
| 100 | Max | max@gmail.com |
| 101 | Max | max2@gmail.com |
| 102 | Pierre | pierre@gmail.com |
| 103 | Max | max@gmail.com |
| 104 | Sam | |
| 105 | Max | max@gmail.com |
期望输出结果
Max: 3 /* 对应邮箱max@gmail.com */ Max: 1 /* 对应邮箱max2@gmail.com */ Pierre: 1 Sam: ignore (because no email exists)
当前单个用户统计代码
global $wpdb; $count = $wpdb->get_var(' SELECT COUNT(comment_author) FROM ' . $wpdb->comments . ' WHERE comment_author_email = "' . get_comment_author_email() . '" '); echo $count . ' comments';
需求
实现按用户名+邮箱分组统计所有评论数量,同时忽略无邮箱的评论(如Sam的记录)。
解决方案
核心SQL语句
通过GROUP BY同时按用户名和邮箱分组,过滤掉邮箱为空的记录,用主键comment_ID统计每组评论数(更严谨):
SELECT comment_author, comment_author_email, COUNT(comment_ID) AS comment_count FROM wp_comments WHERE comment_author_email != '' -- 排除无邮箱的记录 GROUP BY comment_author, comment_author_email ORDER BY comment_author, comment_count DESC;
WordPress适配代码
用$wpdb->get_results()获取所有分组结果,循环输出成期望格式,同时单独处理无邮箱的用户:
global $wpdb; // 获取有邮箱用户的分组统计结果 $results = $wpdb->get_results(" SELECT comment_author, comment_author_email, COUNT(comment_ID) AS comment_count FROM {$wpdb->comments} WHERE comment_author_email != '' GROUP BY comment_author, comment_author_email ORDER BY comment_author, comment_count DESC "); // 输出有邮箱用户的统计 foreach ($results as $row) { echo "{$row->comment_author}: {$row->comment_count}"; // 可选:显示对应邮箱的备注,取消下面注释即可 // echo " /* 对应邮箱{$row->comment_author_email} */"; echo "<br>"; } // 获取并输出无邮箱的用户提示 $no_email_users = $wpdb->get_results(" SELECT DISTINCT comment_author FROM {$wpdb->comments} WHERE comment_author_email = '' "); foreach ($no_email_users as $user) { echo "{$user->comment_author}: ignore (because no email exists)<br>"; }
关键说明
- 用
COUNT(comment_ID)替代COUNT(comment_author),避免因用户名为空导致的统计误差,更严谨。 GROUP BY comment_author, comment_author_email确保同一用户名但不同邮箱的记录被分开统计(如Max的两个分组)。- 过滤条件
comment_author_email != ''直接排除无邮箱的评论,符合需求中忽略Sam的要求。
内容的提问来源于stack exchange,提问作者Pepe
相关产品推荐
相关产品推荐

