對于SQL語句的JOIN語句,大家并不陌生。關于其中的where語句中進行内容過濾還是在 On 語句中或者having進行過濾,這個是值得注意的。
案例:找出某段時間内注冊的新使用者,沒有通過新手任務當中具體哪一步任務,統計
其中涉及到兩張表
使用者基礎表:user_base, user_id, 注冊時間 created_at
任務表: user_id,task_id,task_status
A 語句:
select min(b.task_id) life,task_status, a.user_id from user_tasks b join (select user_id from user_bases where created_at between ' ' and ' ' ) a on a.user_id=b.user_id group by a.user_id having b.task_status<3;
B語句:
select min(task_id),task_status,a.user_id from user_tasks b join (select user_id from user_bases where created_at between ' ' and ' ' ) a on a.user_id=b.user_id and task_status<3 group by user_id;
A,B語句最大的差别是對 task_status<3 進行過濾的先後順序。
A,語句中表内容進行連結比對時,以user_id為準,找出每個使用者的task_id,最後是 having task_status<3 過濾
B,語句是表内容進行比對時,task_status<3進行join并且按照group by 求出每個使用者min task_id.
是以B語句是符合标準的。
對于Join 進行連結時,要确定好以哪些字段進行過濾内容!
本文轉自 位鵬飛 51CTO部落格,原文連結:http://blog.51cto.com/weipengfei/1117069,如需轉載請自行聯系原作者