You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:29:32