使用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 ...
我不明白为什么这会让我疯狂几个小时!而且,当我只进行一次计数时,结果是正确的。
任何想法??
非常感谢提前:)
答案 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)
当你计算()时,你计算行数,而不是结果集中不同值的数量。您是正确的,这个数字正在成倍增加:每个用户 - 商店 - 事件组合的结果集中都有一行。