如何通过comment_id关联,按Country统计commentmeta表中Great的数量?
解决方案
要实现按国家统计Voting为Great的次数,核心是通过comment_id将同一评论的Voting和Country记录关联起来,筛选出符合条件的记录后再分组统计。以下是两种可行的实现方式:
方式一:表自连接(JOIN)
通过将commentmeta表自身连接,分别筛选Voting和Country的记录,再通过comment_id关联,最后按国家分组统计:
统计单个国家(比如UK)的Great次数
<?php global $wpdb; // 关联Voting=Great的记录和Country=UK的记录,统计数量 $votes = $wpdb->get_var(" SELECT COUNT(DISTINCT c.comment_id) FROM $wpdb->commentmeta c JOIN $wpdb->commentmeta v ON c.comment_id = v.comment_id WHERE c.meta_key = 'Country' AND c.meta_value = 'UK' AND v.meta_key = 'Voting' AND v.meta_value = 'Great' "); echo '<div class="votes">'. $votes .'</div>'; ?>
统计所有国家的Great次数(批量输出)
<?php global $wpdb; // 获取所有国家对应的Great投票次数 $results = $wpdb->get_results(" SELECT c.meta_value AS country, COUNT(DISTINCT c.comment_id) AS great_count FROM $wpdb->commentmeta c JOIN $wpdb->commentmeta v ON c.comment_id = v.comment_id WHERE c.meta_key = 'Country' AND v.meta_key = 'Voting' AND v.meta_value = 'Great' GROUP BY c.meta_value "); // 循环输出结果 foreach ($results as $row) { echo '<div class="votes">'. $row->country .': '. $row->great_count .'次</div>'; } ?>
方式二:条件聚合+子查询
先通过子查询筛选出所有Voting为Great的comment_id,再基于这些ID匹配对应的Country记录并统计:
<?php global $wpdb; $results = $wpdb->get_results(" SELECT meta_value AS country, COUNT(*) AS great_count FROM $wpdb->commentmeta WHERE meta_key = 'Country' AND comment_id IN ( SELECT comment_id FROM $wpdb->commentmeta WHERE meta_key = 'Voting' AND meta_value = 'Great' ) GROUP BY country "); foreach ($results as $row) { echo '<div class="votes">'. $row->country .': '. $row->great_count .'次</div>'; } ?>
原代码问题说明
你当前的代码仅筛选了meta_key='country'且meta_value='UK'的记录,但没有关联Voting=Great的条件,所以统计的是所有标记为UK的评论总数,而非其中Voting为Great的数量。上述两种方式都通过comment_id关联了Voting和Country的记录,确保只统计符合双重条件的评论。
内容的提问来源于stack exchange,提问作者Pepe
相关产品推荐
相关产品推荐

