0

我有一个mails表格,它是我处理邮件的主要表格。我也有FK 连接它们mails_sent并包含如下数据- 一封邮件可能有多个发送日期设置,所以我知道用户为发送邮件设置的所有日期在哪里和mails_datesmailsmails_dates1:NNmails_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;

但问题是 Ifsending_dates包含比方说 - 6 个值,并且sent_dates只有一个我最终得到一个包含 6 倍值的字符串sent_dates。这是在生产中,所以我没有很多记录,但同样的情况发生在我有 2 条sending_dates和 1 条记录的查询中,但我sent_dates仍然从sent_dates.

我怎样才能解决这个问题?

谢谢

勒隆

4

1 回答 1

0

好的,我找到了解决方案,这里是:

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

换句话说,只需使用DISTINCT.

于 2012-06-15T07:10:44.480 回答