Codeigniter SUM和LEFT JOIN同时删除重复项

时间:2016-02-16 17:58:26

标签: mysql sql codeigniter sum left-join

我正在加入4个表来获得第一个表中存在的金额的总和。到目前为止,我已经尝试了许多替代方案以获得总和,但是如果我不使用group_by,它或者变为0(如果我是group_by),或者重复。这是我的代码:

$this->db->select('COALESCE(SUM(cust_ reservation_request.dollar_amount), "0") as total');
        $this->db->join('cust_ reservation_request', 'cust_ reservation_request.id = cust_reservations.rid', 'LEFT');
        $this->db->join('attendees', 'cust_rid= cust_ reservation_request.id', 'LEFT');
        $this->db->join('cust_reservation_cancelled', 'cust_reservation_cancelled.rid = cust_ reservation_request.id', 'LEFT');
        $this->db->where('cust_ reservation_request.tid IN (5, 6, 7, 8)->where('attendees.status', 1)->where('cust_reservation_cancelled.rid IS NULL');
        $this->db->group_by('cust_reservation_request.id');
        $total = $this->db->get('cust_reservations')->row()->total;

我得到0作为$ total变量的值,而它应该是288。 但是,当我删除$this->db->group_by('cust_reservation_request.id');语句时,我在attendees.attendees.cust_rid上得到了重复,实际上是{$ 1}},$ total变为498,因为可以有多个与会者同时摆脱。我想删除这个副本,保留所有dollar_amount字段的实际SUM。

我的表是:

cust_ reservation_request
id   // index, foreign key in rest of other tables
tid
uid
dollar_amount

cust_reservations
id
rid  // related to id in cust_ reservation_request table
reservation_date
pay_token

cust_ reservation_cancelled
id
rid  // related to cust_ reservation_request.id
cancel_date

attendees
id
cust_rid // its the same rid, related to cust_reservation_request.id
status

你认为有更安全的方法可以做到这一点,在以正确的方式进行SUM时删除重复项吗?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我原来的回答是:"我认为您的数据有问题,查询返回NULL,由COALESCE"转换为0,但问题不在于此。 "状态"存在问题。 "参与者"表,它主要是通过主题启动器解决的,所以我不配得到点

扎法尔,很高兴你设法解决了这个问题。来自以色列的问候:)

答案 1 :(得分:0)

可能是...... (翻译它将如何在大型机上)

它会是这样的:

    $this->db->select('COALESCE(SUM(cust_ reservation_request.dollar_amount), "0") as total');
            $this->db->where exists (select 1 from cust_reservations where  cust_reservations.rid = cust_ reservation_request.id);
            $this->db->and exists (select 1 from attendees where cust.rid = cust_reservation_request.id); 
            $this->db->and exists (select 1 from cust_ reservation_cancelled where cust_reservation_cancelled.rid = cust_reservation_request.id);
            $this->db->and ('cust_ reservation_request.tid IN (5, 6, 7, 8)->where('attendees.status', 1)->where('cust_reservation_cancelled.rid IS NULL');
            $this->db->group_by('cust_reservation_request.id');
            $total = $this->db->get('cust_reservations')->row()->total;

你必须检查语法和所有的()和',因为我不知道除了普通的SQL之外的语言,你可能需要改变'并且'存在'在'where exists'和/或改变一个以后的地方an和。

此查询的目的(在纯SQL中)是您希望仅对一个表(cust_reservation_request)中的dollar_amount求和,以确保在具有相同row_id的其他表中也存在一行。

希望这有帮助。