【问题标题】:Active Record - CodeIgniter : multiple COUNT on 3 joined tablesActive Record - CodeIgniter:3 个连接表上的多个 COUNT
【发布时间】:2014-06-06 23:50:21
【问题描述】:

使用 CodeIgniter 和 Active Record 处理项目。

我遇到了一个查询问题: 我的数据库中有 3 个表,我不仅想加入,还想对其中的 2 个进行计数。这些表分别与 user_id、store_user_id、event_user_id 字段链接

表 1:用户 user_id

表 2:商店 store_user_id

表 3:事件 event_user_id

我想做的是:

1 - 从用户那里获取所有数据 2 - 计算 store_user_id = user_id 的商店数量(可能为 0) 3 - 用 event_user_id = user_id 计算事件的数量(可能是 0)

我已经在我的函数中这样做了:

    $this->db->select('*');
    $this->db->select('COUNT(s.store_user_id) as total_store', FALSE);
    $this->db->select('COUNT(e.event_user_id) as total_event', FALSE);
    $this->db->from('user u');
    $this->db->join('store s', 's.store_user_id = u.user_id', 'left'); // this joins the user table to store table
    $this->db->join('event e', 'e.event_user_id = u.user_id', 'left'); // this joins the user table to event table  
    $this->db->group_by('u.user_id');

    $q = $this->db->get();
    if ($q->num_rows()>0){
        foreach ($q->result() as $rows) {       
            $data[] = $rows;
        }

        return $data;
    }

问题是当我在视图中显示total_store和total_event时,结果是一样的,我认为它们之间的数字是相乘的..

例如: 对于我有 3 个事件和 4 个商店的用户,显示的结果将是 total_event = total_store = 12 ...

我不明白为什么,这让我疯狂了好几个小时!!而且,当我只数一个时,结果是正确的..

有什么想法吗??

提前非常感谢:)

【问题讨论】:

    标签: php sql codeigniter activerecord join


    【解决方案1】:

    最后我实现了这个基本的SQL查询:

    $this->db->query('SELECT 
                    u.*,
                    x.total_store,
                    y.total_event
                FROM 
                user u
    
                LEFT OUTER JOIN (SELECT s.store_user_id, COUNT(s.store_user_id) AS total_store
                    FROM store s
    
                    GROUP BY s.store_user_id) x ON x.store_user_id = u.user_id
    
                LEFT OUTER JOIN (SELECT e.event_user_id, COUNT(e.event_user_id) AS total_event  
    
                FROM event e
    
                    GROUP BY e.event_user_id) y ON y.event_user_id = u.user_id
            ');
    

    希望对他人有所帮助

    【讨论】:

    【解决方案2】:

    当您 count() 时,您计算的是行数,而不是结果集中不同值的数量。你是对的,这个数字正在成倍增加:每个用户-商店-事件组合的结果集中都有一行。

    【讨论】:

    • 感谢您的解释。您知道如何在结果集中获得不同的值吗?
    • 感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多