Active Record - CodeIgniter:3个连接表上的多个COUNT

时间:2014-06-06 23:50:22

标签: php sql codeigniter activerecord join

使用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 ...

我不明白为什么这会让我疯狂几个小时!而且,当我只进行一次计数时,结果是正确的。

任何想法??

非常感谢提前:)

2 个答案:

答案 0 :(得分:2)

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

希望它能帮助别人

答案 1 :(得分:1)

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