【发布时间】:2012-06-15 06:49:21
【问题描述】:
我有一个mails 表,这是我处理邮件的主要表。我也有mails_sent 和mails_dates,它们有FK 将它们与mails 连接起来,并包含如下数据mails_dates - 一封邮件可能有多个发送日期,所以我有1:N @987654327 @ 是用户为发送邮件设置的所有日期,mails_sent - 发送邮件后,此表中会添加一条新记录,其中包含邮件的id 和发送日期。因为正如我提到的,邮件可以在这里多次发送,关系也是1:N,其中N 表示发送邮件的不同日期。
我需要在 UI 中显示此信息。首先我必须只显示发送日期,然后我使用这个:
$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 值的字符串。这是在生产中,所以我没有很多记录,但同样的情况发生在我有 2 个 sending_dates 和 1 个 sent_dates 记录的查询中,我仍然从 sent_dates 获得 2 倍的记录。
我该如何解决这个问题?
谢谢
勒隆
【问题讨论】:
-
使
mails_sent成为内部 JOIN。 -
不,这样我也不会得到所有结果。我看到使用 distinct 解决了类似的问题,但我尝试了一些方法,仍然没有成功。
标签: sql codeigniter activerecord