2012-06-15 2 views
0

메일 조작을위한 주요 테이블 인 mails 테이블이 있습니다. 나는 또한 mails_sentmails_dates을 가지고 있는데, 이것들은 mails과 FK를 연결하고 다음과 같은 데이터를 포함하고있다 : mails_dates - 하나의 메일이 둘 이상의 날짜 집합을 가질 수 있으므로 보낼 곳이있다. 1:N 여기서 N은 메일에 대해 사용자로부터 모든 날짜가 설정되어있다. mails_sent - 메일을 보낸 후이 테이블에 메일의 id 및 보낸 날짜와 함께 새 레코드가 추가됩니다. 내가 말했듯이 메일이 여기에 한 번 이상 전송 될 수 있기 때문에 관계도 1:N입니다. 여기에서 N은 메일이 전송 된 다른 날짜를 나타냅니다.CodeIgniter 활성 레코드 - 선택 쿼리에서 재발행을 반복합니다.

UI에이 정보를 표시해야합니다. 우선은 전송 날짜와 I 사용자가이를 보여주고 있었다 :

$this->db->select("mails.id, mails.subject, mails.dt_created, mails.groups"); 
     $this->db->select("GROUP_CONCAT(DATE_FORMAT(mails_dates.dt_sending_date, '%d-%m-%Y')) AS sending_dates", FALSE); 
     $this->db->join('mails_dates','mails_dates.mail_id = mails.id', 'left'); 
     $this->db->join('mails_sent','mails_sent.mail_id = mails.id', 'left'); 


     $this->db->from('mails'); 
     $this->db->group_by('mails.id'); 
     $res = $this->db->get()->result_array(); 

     return $res; 

나는이 모든 것을 내가 그 안에 모든 날짜 문자열을 얻고 있었다 괜찮다고 사용하고 있었다. 그러나 문제는 메일을 보낸 날짜를 얻으려고 할 때입니다. 내 쿼리는 다음과 같습니다 만들기

$this->db->select("GROUP_CONCAT(DATE_FORMAT(mails_sent.dt_sent, '%d-%m-%Y')) AS sent_dates", FALSE); 

: 나는 선택 하나 더 추가

$this->db->select("mails.id, mails.subject, mails.dt_created, mails.groups"); 
    $this->db->select("GROUP_CONCAT(DATE_FORMAT(mails_sent.dt_sent, '%d-%m-%Y')) AS sent_dates", FALSE); 
    $this->db->select("GROUP_CONCAT(DATE_FORMAT(mails_dates.dt_sending_date, '%d-%m-%Y')) AS sending_dates", FALSE); 
    $this->db->join('mails_dates','mails_dates.mail_id = mails.id', 'left'); 
    $this->db->join('mails_sent','mails_sent.mail_id = mails.id', 'left'); 

    $this->db->from('mails'); 
    $this->db->group_by('mails.id'); 
    $res = $this->db->get()->result_array(); 

    return $res; 

그러나 문제는 sending_dates이하자가 포함 된 경우의 말할 것입니다 - 6 개 값 및 sent_dates은 내가 끝낼 일이있다 값이 6 배인 sent_dates의 문자열 이것은 프로덕션에서 많은 레코드가 없지만 같은 결과가 sent_dates에서 2 번 레코드 인 sent_dates에 대해 2 sending_dates과 1 레코드가있는 쿼리에서 발생합니다.

어떻게 해결할 수 있습니까? 즉

$this->db->select("GROUP_CONCAT(DISTINCT(DATE_FORMAT(mails_sent.dt_sent, '%d-%m-%Y'))) AS sent_dates", FALSE); 

그냥 DISTINCT를 사용 :

감사

Leron

+0

'mails_sent'를 내부 JOIN으로 만듭니다. –

+0

아니,이 방법으로 모든 결과도 얻지 못합니다. 나는 뚜렷한 것을 사용하여 비슷한 문제가 해결되는 것을 보았지만 몇 가지 시도를했지만 여전히 성공하지 못했습니다. – Leron

답변

0

좋아, 내가 여기있다, 해결책을 발견했다.

관련 문제