活动记录- CodeIgniter:对3个连接表进行多重计数



使用CodeIgniter和Active Record进行项目。

我面对一个查询问题:我有3个表在我的数据库,我想不仅要加入,而且要使计数2。表分别用user_id, store_user_id, event_user_id字段链接

表1:useruser_id

表2:storestore_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时,结果是相同的,我认为数字在它们之间相乘。

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

我不明白为什么,它让我疯狂了几个小时!!此外,当我只计数一次时,结果是正确的…

任何想法?

提前感谢:)

最后我实现了这个基本的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
        ');

希望对别人有所帮助

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

最新更新