數據庫使用邏輯刪除時在新增查詢時遇到的問題


  昨天在工作的時候遇到如下的情況

  現在有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 的執行順序讓我腦殼疼了很久)

 

  

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM