專門做學(xué)校政府的網(wǎng)站今天宣布疫情最新消息
剛開始工作 業(yè)務(wù)能力比較薄弱 記錄一下這幾天遇見的一個(gè)業(yè)務(wù)問題
場(chǎng)景
先簡(jiǎn)單說一下場(chǎng)景,有一批客戶(一張表),可以根據(jù)這個(gè)客戶匹配出很多明細(xì)數(shù)據(jù)(另一張表),現(xiàn)在需要?jiǎng)h除明細(xì),一個(gè)客戶可以匹配出很多的明細(xì)數(shù)據(jù),在刪除的時(shí)候如果某個(gè)客戶的明細(xì)數(shù)據(jù)全部刪除了,就刪除這個(gè)客戶。
刪除時(shí)接口參數(shù)為明細(xì)表的id數(shù)組
明細(xì)表中字段有 id、customer_id、deleted 這三個(gè)字段(其他忽略)。
怎么直接寫一個(gè)sql的到需要?jiǎng)h除的客戶id
思路一:
首先根據(jù)id查到客戶id,在查到還有明細(xì)數(shù)據(jù)的客戶id,吧這些id剔除掉就是需要?jiǎng)h除的客戶id
SELECT customer_id
FROM match_detail
WHERE deleted = 0 AND customer_id IN (
SELECT DISTINCT customer_id
FROM match_detail
WHERE id in (1,2,3,4) )
然后在代碼中剔除掉就可以了。
思路二
第一種當(dāng)然可以 但是能直接查出來需要?jiǎng)h除的客戶id更好,既然如此直接NOT IN 不就好了
大家可以想一下SQL應(yīng)該怎么寫。
我的想法是直接先查出來所有的客戶id,然后查出有明細(xì)的客戶ID,然后拿全量的客戶ID NOT IN 一下不就行了。
這是我寫出來下面的SQL
SELECT DISTINCTcustomer_id
FROM`match_detail`
WHERE`id` IN(1) AND `customer_id` NOT IN(SELECT DISTINCT`customer_id`FROM`match_detail`WHERE`id` IN(1) AND `deleted` = 0;
)
大家看一下這個(gè)SQL有什么問題嗎?
很明細(xì)這個(gè)SQL有個(gè)問題子查詢永遠(yuǎn)不會(huì)有值,因?yàn)楦鶕?jù)id已經(jīng)刪除過了,還要滿足未刪除,那么這個(gè)sql會(huì)查處所有的客戶id
所以肯定是不滿足的。
知道了問題在哪,那么是不是子查詢的條件應(yīng)該是找到所有客戶id的明細(xì)數(shù)據(jù)。所以有了以下的SQL
SELECT DISTINCTcustomer_id
FROM`match_detail`
WHERE`id` IN(1) AND `customer_id` NOT IN(SELECT DISTINCT`customer_id`FROM`match_detail`WHERE`customer_id` IN(SELECT DISTINCT`customer_id`FROM`match_detail`WHERE`id` IN(1) ) AND `deleted` = 0);
這個(gè)SQL經(jīng)過驗(yàn)證是符合要求的,然后經(jīng)過優(yōu)化,又有了下面的SQL
SELECT DISTINCTt1.customer_id
FROMmatch_detail t1
LEFT JOINmatch_detail t2 ON t1.customer_id = t2.customer_id AND t2.deleted = 0
WHEREt1.id IN (1, 2, 3, 4, 6) AND t2.customer_id IS NULL;
這也算是一次踩坑吧,每一次踩坑都是一次進(jìn)步,雖然很簡(jiǎn)單,但是過程中也會(huì)遇到考慮不到的點(diǎn)。
有什么問題,或者大家有什么好的解決思路。歡迎指正,一起學(xué)習(xí)。