如何用CodeIgniter查询构造器统计关联表去重记录及单查实现指定结果
问题解答
嘿,我来帮你搞定这两个问题!
1. 单条MySQL查询实现指定输出(含CodeIgniter查询构造器写法)
你要的输出完全可以通过单条SQL实现,而且用LEFT JOIN比你尝试的Union更合适——因为我们需要保留Order表的所有记录,同时关联Room表统计不同服务员的数量。
原生SQL写法
SELECT o.oid, COUNT(DISTINCT r.waiter_assigned) AS total_waiters FROM `order` o LEFT JOIN room r ON o.oid = r.oid GROUP BY o.oid ORDER BY o.oid;
这个查询会:
- 以
Order表为主表,左连接Room表,确保所有订单ID都被列出 - 用
COUNT(DISTINCT r.waiter_assigned)统计每个订单下唯一的服务员数量,没有服务员的订单会返回0 - 按订单ID分组排序,完全匹配你要的输出格式
CodeIgniter查询构造器实现
对应到CodeIgniter的写法如下:
// 构建查询 $this->db->select('o.oid, COUNT(DISTINCT r.waiter_assigned) AS total_waiters'); $this->db->from('order o'); // 左连接Room表,关联条件为订单ID匹配 $this->db->join('room r', 'o.oid = r.oid', 'left'); // 按订单ID分组,确保每个订单只返回一条统计结果 $this->db->group_by('o.oid'); // 按订单ID排序(可选,让结果更整齐) $this->db->order_by('o.oid'); // 执行查询并获取结果 $query = $this->db->get(); $results = $query->result();
你之前用Union的问题在于:Union是把两个独立的结果集拼接在一起,而非关联匹配数据,所以会出现重复的oid和空值,这显然不是你想要的关联统计效果。
2. CodeIgniter查询构造器统计关联表中的DISTINCT记录
其实上面的写法已经覆盖了这个场景的解决方案,核心要点总结:
- 根据需求选择关联类型:用
LEFT JOIN保留主表所有记录,用INNER JOIN只保留两表都匹配的记录 - 用
COUNT(DISTINCT 字段名)实现去重统计 - 按主表的分组字段(比如这里的
o.oid)进行分组,确保每个分组只返回一条统计结果
如果是其他关联表的去重统计,只需要调整关联条件、统计字段和分组字段即可。
内容的提问来源于stack exchange,提问作者Bry
相关产品推荐
相关产品推荐

