【问题标题】:Codeigniter - Active record - sql - complex joinCodeigniter - 活动记录 - sql - 复杂连接
【发布时间】:2011-07-08 21:55:06
【问题描述】:

我有一个从表中检索所有标签的函数:

function global_popular_tags() {
    $this->db->select('tags.*, COUNT(tags.id) AS count');
    $this->db->from('tags');
    $this->db->join('tags_to_work', 'tags.id = tags_to_work.tag_id');
    $this->db->group_by('tags.id');
    $this->db->order_by('count', 'desc'); 
    $query = $this->db->get()->result_array();
    return $query;
}

我还有一张名为“work”的桌子。 “工作”表有一个“草稿”列,其值为 1 或 0。我希望 COUNT(tags.id) 考虑使用特定标签的工作是否处于草稿模式 (1)。

假设有 10 件作品标有“设计”等标签。 COUNT 将是 10。但是这些作品中有 2 件处于草稿模式,所以 COUNT 应该是 8。我该如何管理?

【问题讨论】:

  • 如有疑问,您可以随时切换到普通 SQL。
  • 作为预防措施,您需要避免在查询中使用* 选择器,这不是一个好习惯,始终定义您想要返回的列名,NEVERSELECT * FROM...

标签: php sql codeigniter activerecord


【解决方案1】:

您可以使用纯 sql 而不是使用活动记录类,我自己使用 CI 超过 2 年,大部分时间我都避免使用活动记录类,因为直接 sql 更容易调试和编写复杂查询。 这就是我将如何使用它。

$sql = "选择...你的 sql"; $q = $this->db->query($sql); ... //在这里对你的查询做一些事情

【讨论】:

    【解决方案2】:

    尝试改变:

    $this->db->from('tags');
    $this->db->join('tags_to_work', 'tags.id = tags_to_work.tag_id');
    

    收件人:

    $this->db->from('tags, work');
    $this->db->join('tags_to_work', 'tags.id=tags_to_work.tag_id AND work.id=tags_to_work.work_id');
    

    并添加:

    $this->db->where('work.drafts', 0);
    

    【讨论】:

    • 谢谢,但不是工作表有 'tag_id' 列,而是 tags_to_work 表有。我试过: $this->db->join('tags_to_work AS ttw', 'work.id = ttw.work_id AND work.draft = 0');但我得到的计数是 33 而不是 1,是 66 而不是 2!
    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2013-04-11
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多