2016-02-16 2 views
0

Мне осталось соединить 4 таблицы, чтобы получить СУММУ суммы, которая присутствует в первой таблице. До сих пор я пробовал много альтернатив, чтобы получить сумму прямо, но либо она становится 0 (если я group_by), либо дублирует, если я не использую group_by. Вот мой код:Codeigniter SUM и LEFT JOIN при удалении дубликатов

$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 в качестве значения $ общих переменных, в то время как она должна быть 288. Однако, когда я удалить $this->db->group_by('cust_reservation_request.id'); заявления, я дублировать на attendees.attendees.cust_rid, что на самом деле есть, $ total становится 498, так как для одного и того же диска может быть более одного участника. Я хочу удалить этот дубликат, сохраняя фактический SUM всех полей dollar_amount.

Мои таблицы:

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 надлежащим образом?

Заранее благодарю за любую помощь.

+0

Попробуйте запустить его без условия «WHERE cust_reservation_cancelled.rid IS NULL» – IgorM

+0

Можете ли вы запустить его как SQL-запрос на сервере, не имея дело с каркасом? Таким образом будет легче отлаживать – IgorM

+0

Привет @IgorM спасибо за ваш ответ. Я попробовал запустить его на сервере, он возвращает 0 при добавлении group_by и возвращает повторяющиеся строки после использования SUM. Я также попытался использовать SELECT * вместо SUM только для того, чтобы увидеть возвращаемые результаты, и там я знаю, что он возвращает строку два раза. – Zafar

ответ

0

Мой первоначальный ответ был: «Я думаю, что у вас проблемы с вашими данными, и запрос возвращает NULL, который был преобразован в 0 COALESCE», но это не было проблемой. В таблице «Участники» возникла проблема с полем «статус», и она была решена главным образом по теме стартера, поэтому я не заслуживаю очков здесь

Zafar, счастлив, что вам удалось решить эту проблему. Привет из Израиля :)

+0

Как я уже объяснил, я попытался запустить его без «COALESCE», просто поставив его в select: «SELECT SUM (user_reservation_request.dollar_amount) как total', и это не сработало. Он снова послал мне 0. – Zafar

+0

Если у меня проблема с данными, она не должна возвращать некоторую сумму, когда я удаляю group_by! Он возвращает некоторую сумму, но с повторяющейся записью, и я могу ее увидеть, когда запускаю ее в mySQL. – Zafar

+0

@ Zafar, вы говорите, что вы получаете 0, запуская следующий запрос SELECT SUM (dollar_amount) FROM cust_ reservation_request ... Разве вы не думаете, что что-то не так с вашим типом данных? – IgorM

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, вам, возможно, придется изменить «и существует» в «где существует» и/или изменить a где позже в a и.

Цель этого запроса (в простом SQL) состоит в том, что вы хотите суммировать значение dollar_amount только из одной таблицы (cust_ reservation_request), где вы хотите быть уверенным, что также существует строка в других таблицах с тем же row_id ,

Надеюсь, это поможет.

+0

Спасибо за ваш комментарий @BenLink, однако, как уже объяснил IgorM , Я решил его с подзапросом, а затем глобально применяя 'where attendees.status = 1'. Однако я ценю ваши усилия. Спасибо. – Zafar

Смежные вопросы