日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

mysql 判斷是否為子集的方法步驟

瀏覽:118日期:2023-10-05 18:29:43
一、問題

故事起源于一個查詢錯漏率的報表:有兩個查詢結果,分別是報告已經添加的項目和報告應該添加的項目,求報告無遺漏率

何為無遺漏?即,應該添加的項目已經被全部添加

報告無遺漏率也就是無遺漏報告數占報告總數的比率

這里以兩個報告示例(分別是已全部添加和有遺漏的報告)

首先,查出第一個結果——報告應該添加的項目

SELECT r.id AS 報告ID,m.project_id 應添加項目FROM report r INNER JOIN application a ON r.app_id=a.id INNER JOIN application_sample s ON a.id=s.app_id RIGHT JOIN application_sample_item si ON s.id=si.sample_id RIGHT JOIN set_project_mapping m ON si.set_id=m.set_idWHERE r.id IN (’44930’,’44927’)ORDER BY r.id,m.project_id;

mysql 判斷是否為子集的方法步驟

然后,再查出第二個結果——報告已經添加的項目

SELECT r.id AS 報告ID,i.project_id AS 已添加項目 FROM report r RIGHT JOIN report_item i ON r.id=i.report_idWHERE r.id IN (’44930’,’44927’);

mysql 判斷是否為子集的方法步驟

以上就是我們要比較的結果集,不難看出報告44927是無遺漏的,而44930雖然項目數量一致,但實際是多添加了項目758,缺少了項目112,是有遺漏的報告

二、解決方案

從問題看,顯然是一個判斷是否為子集的問題??梢苑謩e遍歷已添加的項目和應該添加的項目,如果應該添加的項目在已添加的項目中都能匹配上,即代表應該添加的項目是已添加的項目子集,也就是無遺漏。

通過循環遍歷比較確實可以解決這個問題,但是SQL中出現笛卡兒積的交叉連接往往意味著開銷巨大,查詢速度慢,那么有沒有辦法避免這一問題呢?

方案一:

借助于函數 FIND_IN_SET和GROUP_CONCAT, 首先認識下兩個函數

FIND_IN_SET(str,strlist)

str: 需要查詢的字符串 strlist: 參數以英文”,”分隔,如 (1,2,6,8,10,22)

mysql 判斷是否為子集的方法步驟

FIND_IN_SET 函數返回了需要查詢的字符串在目標字符串的位置

GROUP_CONCAT( [distinct] 要連接的字段 [order by 排序字段 asc/desc ] [separator ’分隔符’] )

mysql 判斷是否為子集的方法步驟

GROUP_CONCAT()函數可以將多條記錄的同一字段的值,拼接成一條記錄返回。默認以英文‘,’分割

但是,GROUP_CONCAT()默認長度為1024

mysql 判斷是否為子集的方法步驟

所以,如果需要拼接的長度超過1024將會導致截取不全,需要修改長度

SET GLOBAL group_concat_max_len=102400;SET SESSION group_concat_max_len=102400;

從上述兩個函數介紹中,我們發現FIND_IN_SET和GROUP_CONCAT都以英文‘,’分割(加粗標識)

所以,我們可以用GROUP_CONCAT將已添加項目的項目連接為一個字符串,然后再用FIND_IN_SET逐一查詢應添加項目是否都存在于字符串

1、修改問題中描述中的SQL,用GROUP_CONCAT將已添加項目的項目連接為一個字符串

SELECT r.id,GROUP_CONCAT(i.project_id ORDER BY i.project_id,’’) AS 已添加項目列表 FROM report r LEFT JOIN report_item i ON r.id=i.report_idWHERE r.id IN (’44930’,’44927’)GROUP BY r.id;

mysql 判斷是否為子集的方法步驟

2、用FIND_IN_SET逐一查詢應添加項目是否都存在于字符串

SELECT Q.id,FIND_IN_SET(W.應添加項目列表,Q.已添加項目列表) AS 是否遺漏 FROM ( -- 報告已經添加的項目 SELECT r.id,GROUP_CONCAT(i.project_id ORDER BY i.project_id,’’) AS 已添加項目列表 FROM report r LEFT JOIN report_item i ON r.id=i.report_id WHERE r.id IN (’44930’,’44927’) GROUP BY r.id )Q, ( -- 報告應該添加的項目 SELECT r.id,s.app_id,m.project_id 應添加項目列表 FROM report r INNER JOIN application a ON r.app_id=a.id INNER JOIN application_sample s ON a.id=s.app_id INNER JOIN application_sample_item si ON s.id=si.sample_idINNER JOIN set_project_mapping m ON si.set_id=m.set_id WHERE r.id IN (’44930’,’44927’) ORDER BY r.id,m.project_id )W WHERE Q.id=W.id;

mysql 判斷是否為子集的方法步驟

3、過濾掉有遺漏的報告

SELECT Q.id,CASE WHEN FIND_IN_SET(W.應添加項目列表,Q.已添加項目列表)>0 THEN 1 ELSE 0 END AS 是否遺漏 FROM ( -- 報告已經添加的項目 SELECT r.id,GROUP_CONCAT(i.project_id ORDER BY i.project_id,’’) AS 已添加項目列表 FROM report r LEFT JOIN report_item i ON r.id=i.report_id WHERE r.id IN (’44930’,’44927’) GROUP BY r.id )Q, ( -- 報告應該添加的項目 SELECT r.id,s.app_id,m.project_id 應添加項目列表 FROM report r INNER JOIN application a ON r.app_id=a.id INNER JOIN application_sample s ON a.id=s.app_id INNER JOIN application_sample_item si ON s.id=si.sample_idINNER JOIN set_project_mapping m ON si.set_id=m.set_id WHERE r.id IN (’44930’,’44927’) ORDER BY r.id,m.project_id )W WHERE Q.id=W.id GROUP BY Q.id HAVING COUNT(`是否遺漏`)=SUM(`是否遺漏`);

mysql 判斷是否為子集的方法步驟

4、我們的最終目標是求無遺漏率

SELECT COUNT(X.id) 無遺漏報告數,Y.total 報告總數, CONCAT(FORMAT(COUNT(X.id)/Y.total*100,2),’%’) AS 項目無遺漏率 FROM ( SELECT Q.id,CASE WHEN FIND_IN_SET(W.應添加項目列表,Q.已添加項目列表)>0 THEN 1 ELSE 0 END AS 是否遺漏 FROM ( -- 報告已經添加的項目 SELECT r.id,GROUP_CONCAT(i.project_id ORDER BY i.project_id,’’) AS 已添加項目列表 FROM report r LEFT JOIN report_item i ON r.id=i.report_id WHERE r.id IN (’44930’,’44927’) GROUP BY r.id )Q, ( -- 報告應該添加的項目 SELECT r.id,s.app_id,m.project_id 應添加項目列表 FROM report r INNER JOIN application a ON r.app_id=a.id INNER JOIN application_sample s ON a.id=s.app_id INNER JOIN application_sample_item si ON s.id=si.sample_idINNER JOIN set_project_mapping m ON si.set_id=m.set_id WHERE r.id IN (’44930’,’44927’) ORDER BY r.id,m.project_id )W WHERE Q.id=W.id GROUP BY Q.id HAVING COUNT(`是否遺漏`)=SUM(`是否遺漏`) )X, ( -- 總報告數 SELECT COUNT(E.nums) AS total FROM ( SELECT COUNT(r.id) AS nums FROM report r WHERE r.id IN (’44930’,’44927’) GROUP BY r.id )E )Y ;

mysql 判斷是否為子集的方法步驟

方案二:

上述方案一雖然避免了逐行遍歷對比,但本質上還是對項目的逐一對比,那么有沒有什么方式可以不用對比呢?

答案當然是有的。我們可以根據統計數量判斷是否完全包含。

1、使用union all 將已添加項目與應添加項目聯表,不去重

( -- 應該添加的項目SELECT r.id,m.project_idFROM report r INNER JOIN application a ON r.app_id=a.idINNER JOIN application_sample s ON a.id=s.app_idINNER JOIN application_sample_item si ON s.id=si.sample_id INNER JOIN set_project_mapping m ON si.set_id=m.set_idWHERE r.id IN (’44930’,’44927’)ORDER BY r.id,m.project_id)UNION ALL( -- 已經添加的項目select r.id,i.project_id from report r,report_item i where r.id = i.report_id and r.id IN (’44930’,’44927’)group by r.app_id,i.project_id )

mysql 判斷是否為子集的方法步驟

從結果可以看出,項目同一個報告下有重復的項目,分別代表了應該添加和已經添加的項目

2、根據聯表結果,統計報告重合的項目數量

# 應該添加與已經添加的項目重疊數量select tt.id,count(*) count from ( select t.id,t.project_id,count(*) from ( (-- 應該添加的項目SELECT r.id,m.project_idFROM report r INNER JOIN application a ON r.app_id=a.id INNER JOIN application_sample s ON a.id=s.app_id INNER JOIN application_sample_item si ON s.id=si.sample_id INNER JOIN set_project_mapping m ON si.set_id=m.set_idWHERE r.id IN (’44930’,’44927’)ORDER BY r.id,m.project_id ) UNION ALL (-- 已經添加的項目select r.id,i.project_id from report r,report_item i where r.id = i.report_id and r.id IN (’44930’,’44927’)group by r.app_id,i.project_id ) ) t GROUP BY t.id,t.project_id HAVING count(*) >1 ) tt group by tt.id

mysql 判斷是否為子集的方法步驟

3、將第二步的數量與應該添加的數量作比較,如果相等,則代表無遺漏

select bb.id,aa.count 已添加,bb.count 需添加, CASE WHEN aa.count/bb.count=1 THEN 1 ELSE 0 END AS ’是否遺漏’ from (# 應該添加與已經添加的項目重疊數量select tt.id,count(*) count from ( select t.id,t.project_id,count(*) from ( (-- 應該添加的項目SELECT r.id,m.project_idFROM report r INNER JOIN application a ON r.app_id=a.id INNER JOIN application_sample s ON a.id=s.app_id INNER JOIN application_sample_item si ON s.id=si.sample_id INNER JOIN set_project_mapping m ON si.set_id=m.set_idWHERE r.id IN (’44930’,’44927’)ORDER BY r.id,m.project_id ) UNION ALL (-- 已經添加的項目select r.id,i.project_id from report r,report_item i where r.id = i.report_id and r.id IN (’44930’,’44927’)group by r.app_id,i.project_id ) ) t GROUP BY t.id,t.project_id HAVING count(*) >1 ) tt group by tt.id ) aa RIGHT JOIN( -- 應該添加的項目數量 SELECT r.id,s.app_id,COUNT(m.project_id) count FROM report r INNER JOIN application a ON r.app_id=a.id INNER JOIN application_sample s ON a.id=s.app_id INNER JOIN application_sample_item si ON s.id=si.sample_id INNER JOIN set_project_mapping m ON si.set_id=m.set_id WHERE r.id IN (’44930’,’44927’) GROUP BY r.id ORDER BY r.id,m.project_id) bb ON aa.id = bb.id ORDER BY aa.id

mysql 判斷是否為子集的方法步驟

4、求出無遺漏率

select SUM(asr.`是否遺漏`) AS 無遺漏數,COUNT(asr.id) AS 總數,CONCAT(FORMAT(SUM(asr.`是否遺漏`)/COUNT(asr.id)*100,5),’%’) AS 報告無遺漏率from ( select bb.id,aa.count 已添加,bb.count 需添加, CASE WHEN aa.count/bb.count=1 THEN 1 ELSE 0 END AS ’是否遺漏’ from ( # 應該添加與已經添加的項目重疊數量 select tt.id,count(*) count from ( select t.id,t.project_id,count(*) from (( -- 應該添加的項目 SELECT r.id,m.project_id FROM report r INNER JOIN application a ON r.app_id=a.id INNER JOIN application_sample s ON a.id=s.app_id INNER JOIN application_sample_item si ON s.id=si.sample_id INNER JOIN set_project_mapping m ON si.set_id=m.set_id WHERE r.id IN (’44930’,’44927’) ORDER BY r.id,m.project_id)UNION ALL( -- 已經添加的項目 select r.id,i.project_id from report r,report_item i where r.id = i.report_id and r.id IN (’44930’,’44927’) group by r.app_id,i.project_id) ) t GROUP BY t.id,t.project_id HAVING count(*) >1 ) tt group by tt.id ) aa RIGHT JOIN ( -- 應該添加的項目數量 SELECT r.id,s.app_id,COUNT(m.project_id) count FROM report r INNER JOIN application a ON r.app_id=a.id INNER JOIN application_sample s ON a.id=s.app_id INNER JOIN application_sample_item si ON s.id=si.sample_id INNER JOIN set_project_mapping m ON si.set_id=m.set_id WHERE r.id IN (’44930’,’44927’) GROUP BY r.id ORDER BY r.id,m.project_id ) bb ON aa.id = bb.id ORDER BY aa.id) asr;

mysql 判斷是否為子集的方法步驟

到此這篇關于mysql 判斷是否為子集的方法步驟的文章就介紹到這了,更多相關mysql 判斷是否子集內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
92国产精品| 国产91在线精品| 国产亚洲欧美日韩在线观看一区二区 | 电影亚洲精品噜噜在线观看| 免费视频最近日韩| 亚洲手机视频| 欧产日产国产精品视频| 久久a爱视频| 日韩国产欧美在线视频| 亚洲精品综合| 日韩1区2区日韩1区2区| 蜜桃久久久久久久| 视频一区欧美精品| www.九色在线| 久久国内精品| 欧美a在线观看| 国产精品115| 国产一区二区精品福利地址| 精品91福利视频| 亚洲免费福利| 欧美精品一区二区三区精品| 欧美a级一区| 国产免费成人| 亚洲精品一级二级三级| 亚洲精品看片| 欧美在线看片| 国产一区二区亚洲| 久久精品青草| av亚洲免费| 蜜桃久久久久久久| 国产亚洲观看| 日韩精品福利一区二区三区| 国产欧美三级| 久久久蜜桃一区二区人| 一区在线视频观看| 久久精品99国产精品日本| 岛国精品一区| 在线国产一区| 欧美精品国产一区| 亚洲午夜av| 欧美日韩午夜| 91精品一区国产高清在线gif| 伊人成人在线视频| 国产精品亚洲综合久久| 成人欧美一区二区三区的电影| 精品国产欧美日韩| 亚洲少妇自拍| 成人一二三区| 综合国产在线| 六月丁香综合在线视频| 蜜臀久久精品| 国产精品一国产精品| 日韩视频在线一区二区三区| 国产精品美女午夜爽爽| 国产精品7m凸凹视频分类| 日韩高清成人在线| 亚洲网站视频| 免费视频一区二区三区在线观看| 免费视频亚洲| 日韩欧美中文字幕一区二区三区 | 欧美影院视频| 午夜久久福利| 成午夜精品一区二区三区软件| 亚洲成人国产| 国产一区2区| 日韩不卡在线观看日韩不卡视频| 免费精品国产| 在线成人动漫av| 国产精品久久久久久久久久10秀 | 夜久久久久久| 精品国产乱码久久久| 美女精品在线| 亚洲精品永久免费视频| 亚洲开心激情| 蜜桃久久av| 亚洲一区二区三区四区五区午夜| 久久久久国产精品一区二区| 美女久久久久久| 国产精品探花在线观看| 日韩高清二区| 日韩精品欧美大片| 亚洲免费观看高清完整版在线观| 伊人久久婷婷| 久久福利毛片| 蜜桃久久久久久| 中文字幕av亚洲精品一部二部| 久久一区二区三区喷水| 精品久久91| 国产精品v一区二区三区| 国产亚洲高清一区| 国产精品99久久免费| 欧美激情99| www.九色在线| 最新日韩欧美| 日韩中文字幕一区二区高清99| 久久国产精品毛片| 亚洲理论在线| 国产剧情一区二区在线观看| 久久天堂影院| 日韩欧美一区二区三区在线视频| 国产理论在线| 136国产福利精品导航网址| 亚洲一区二区三区高清| 日本中文字幕一区二区视频| 精品久久91| 婷婷成人基地| 国产毛片精品| 国内精品福利| 欧美日韩夜夜| 久久中文字幕av| 亚洲精品看片| 久久影院午夜精品| 亚洲毛片网站| 91视频精品| 日韩精品免费一区二区夜夜嗨| 成人影视亚洲图片在线| 亚洲婷婷丁香| 蜜桃视频在线网站| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲成人三区| 国产精品黄色| 蜜臀久久99精品久久久久宅男| 无码日韩精品一区二区免费| 日韩欧美一区二区三区免费看| 日韩久久一区| 伊人久久亚洲影院| 国产精品毛片久久| 美国欧美日韩国产在线播放| 日韩成人a**站| 国产精品免费大片| 婷婷精品在线| 午夜精品网站| 黄在线观看免费网站ktv| 国产精品一区二区三区www| 日本欧美在线看| 自由日本语亚洲人高潮| 国产精品99一区二区三区| 免费久久99精品国产| 久久精品高清| 中文另类视频| av中文字幕在线观看第一页| 亚洲一区二区三区四区电影| 婷婷久久一区| 婷婷国产精品| 9色国产精品| 亚洲欧美日韩综合国产aⅴ| 欧美日韩在线网站| 极品日韩av| 黄色欧美日韩| 久久99伊人| 日本亚洲视频在线| 国产亚洲一区| 日韩精品乱码av一区二区| 日韩av中文字幕一区二区| 欧美日韩xxxx| 国产成人精品一区二区三区免费 | 97精品中文字幕| 黄色aa久久| 香蕉人人精品| 亚洲永久字幕| 国产欧美一区二区精品久久久 | 国产精品自在| 日韩精品1区2区3区| 国产欧美精品| 欧美激情日韩| 国产真实久久| 日韩视频1区| 中文字幕成在线观看| 亚洲综合图色| 在线手机中文字幕| 国产美女亚洲精品7777| 久久福利影视| 久久一区二区三区喷水| 国产精品色在线网站| 视频一区在线播放| 99久久99视频只有精品| 久久av资源| 蜜臀精品一区二区三区在线观看 | 久久国产精品毛片| 久久九九精品| а√天堂8资源中文在线| 国产亚洲人成a在线v网站| 日韩在线卡一卡二| 国产精品日韩久久久| 精品一区在线| 欧美不卡在线| 999国产精品视频| 欧美精选视频一区二区| 日韩激情综合| 蜜桃一区二区三区在线| 欧美日韩黑人| 亚洲黄色影院| 免费人成在线不卡| 亚洲三级精品| 亚洲精品在线观看91| 天堂va在线高清一区| 红桃视频国产精品| 国产精品宾馆| 国产精品高清一区二区| 欧美精品不卡|