Table user left join table personal_record then join table activity.
user table:id ...
personal_record table: user.id, activity.id, confirm_time...
activity: id, time, delete_time...
note: time means hours spent on this activity, 8 etc.
Before user join personal_record, some of persanoal_record rows need to be filtered as personal_record only valid when confirm_time is set.personal_reocrd only contains activity_id, activity which contains activities' time need to join to sum (time) a person spend.
As a activity is deleted by updating activity.delete_time column.
Here is my code.
Update(Almost solved): ($data_begin filter the range of records)
$result = $this->db->select('user.*, ifnull(sum(ac.time), 0) as time')
->from('user')
->join('(select * from personal_record where personal_record.confirm_time is not null) as pr','user.id = pr.person', 'left')
->join('(select * from activity where activity.delete_time is null and activity.create_time >"'.$date_begin.'")as ac','ac.id = pr.activity', 'left')
->group_by('user.id')
->order_by('time', 'desc')
->get()
->result();