昨天在工作的時候遇到如下的情況
現在有2張表
user | doctor_team_member |
id |
id |
name |
team_id |
hospital_id |
hospital_id |
delete_flg |
delete_flg |
doctor_id |
user表存的是所有的醫生用戶,doctor_team_member 存的是 所有醫院里面已經編入了團隊的醫生。現在需要查詢出某個醫院下面所有沒有加入任何團隊的醫生。
1.0 版本 是這樣的:
SELECT * FROM user u LEFT JOIN doctor_team_members dtm ON u.id = dtm.doctor_id WHERE dtm.team_id IS NULL AND u.hospital_id = 73603893786841088;
這就是忽略了delete_flg=1 被邏輯刪除的用戶 。當有個用戶被邏輯刪除的時候,但在篩選的時候,篩選不出被邏輯刪除的用戶。因為被邏輯刪除的用戶在 doctor_team_members 表中是有數據的可以和user.id 關聯上。
然后就是2.0版本:
SELECT * FROM user u LEFT JOIN
doctor_team_members dtm ON u.id = dtm.doctor_id WHERE (dtm.team_id IS NULL OR dtm.delete_flg ='1') AND u.hospital_id = 73603893786841088;
這樣就可以把被邏輯刪除的用戶再篩選出來。 但現在又出現了新的問題,假如我們新增一個 doctor_team_members數據后。再把他邏輯刪除掉,然后我們再新增同一個醫生加入 doctor_team_members 。現在數據庫里面,有一個邏輯刪除的醫生和一個同名同id 的新加的醫生。這個時候問題就出現了,我們再次查詢的時候,那個醫生就會出現在該醫院下未加入任何團隊的名單里面。當我們再邏輯刪除他的時候再查詢,還有出現多個同名醫生的情況。那些多出來的醫生就是 delete_flg='1'的醫生且同一個的醫生。
然后就是最終解決方案。完全排除 delete_flg='1' 的醫生
SELECT * FROM action_user u LEFT JOIN
doctor_team_members dtm ON u.id = dtm.doctor_id AND dtm.delete_flg ='0' WHERE dtm.team_id IS NULL
AND u.delete_flg = '0'
AND u.hospital_id = 73603893786841088;
在關聯表的時候就把 delete_flg ='1' 的數據去掉,然后再執行 where 的條件進行篩選。這樣就不用受 delete_flg='1'的影響了。
總結:
- 在有邏輯刪除的表里面,增刪改查的時候,首先把 邏輯刪除的 字段 排除掉,然后再做操作。有join 的
就放在 on 的條件里面,先on 再 where 。 (忽視了on 和 where 的執行順序讓我腦殼疼了很久)