【问题标题】:CodeIgniter Active Records - repeating a reusult from a select queryCodeIgniter Active Records - 重复选择查询的结果
【发布时间】:2012-06-15 06:49:21
【问题描述】:

我有一个mails 表,这是我处理邮件的主要表。我也有mails_sentmails_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


【解决方案1】:

好的,我找到了解决办法,就是:

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

换句话说,只需使用DISTINCT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多