2017-06-16 6 views
2

user左結合表personal_record次に表activityを結合します。codeigniter onとの組み合わせ


userテーブル:ID ...

personal_recordテーブル:user.id、activity.id、CONFIRM_TIME ...

activity:ID、時間、delete_time ...

注:時間はこの活動に費やされた時間を意味し、8など。


userの前にpersonal_recordを入力すると、persanoal_recordの行の一部は、personal_recordとしてフィルタリングする必要があり、confirm_timeが設定されている場合にのみ有効です。 personal_reocrdにはactivity_id、activityのみが含まれています。アクティビティには、人が費やす合計(時間)に参加する必要があります。

アクティビティは、activity.delete_time列を更新することによって削除されます。

ここに私のコードです。 (ほぼ解決)

更新:($は、レコードの範囲をフィルタリングするdata_begin)

$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(); 
+0

削除条件と、次のように条件ににそれを追加します - >( '活動'、 '活動に参加します。 id = personal_record.activityとactivity.delete_time = NULL '、' left '、false)@teek – JYoThI

+0

あなたはこの質問を調べてください。 [例](https://stackoverflow.com/questions/11056303/combining-mysql-and-or-queries-in-codeigniter) –

答えて

1
$this->db->select('user.*,personal_record.*,ifnull(sum(activity.time), 0) as time'); 
$this->db->from('user'); 
$this->db->join('personal_record','personal_record.person = user.id'); 
$this->db->join('activity','activity.id = personal_record.activity'); 
$this->db->where('activity.delete_time',null); 
$this->db->or_where('personal_record.confirm_time !=', null); 
$this->db->order_by('time', 'asc'); 
$this->db->group_by('user.id'); 
$data = $this->db->get()->result(); 
return $data; 
+0

「where」を使用すると、一部のユーザーが何らかのアクティビティに参加しなかったユーザーをフィルタリングします。 – teek

関連する問題