mysql使用left?join連接出現(xiàn)重復(fù)問題的記錄
mysql使用left join連接出現(xiàn)重復(fù)
問題描述
在使用連接查詢的時(shí)候,例如以A表為主表,左連接B表,我們期望的是A表有多少條記錄,查詢結(jié)果就有多少條記錄,但是可能會(huì)出現(xiàn)這樣的結(jié)果,就是查詢出來的記錄總條數(shù),多余A表的記錄總條數(shù),并且是查詢的結(jié)果顯示出來時(shí)有部分列是重復(fù)的,簡(jiǎn)單的說,就是產(chǎn)生了笛卡爾積。
問題示例
其中A表是用戶表(user),字段分別是:
ID name userid
1 aaaa 10001
2 bbbb 10002
3 ccccc 10003
B表是第一類產(chǎn)品表(product),字段分別是:
ID title time userid
1 標(biāo)題1 2014-01-01 10002
2 標(biāo)題2 2014-01-01 10002
3 標(biāo)題3 2014-01-01 10001
4 標(biāo)題4 2018-03-20 10002
5 標(biāo)題5 2018-03-20 10003
這個(gè)時(shí)候我們使用下面sql 執(zhí)行的時(shí)候發(fā)現(xiàn)
selecct * from user left join product on user.userid=product.userid;
執(zhí)行結(jié)果竟然比user表的總數(shù)記錄多
問題解決
其實(shí)這個(gè)問題明眼人一眼就看出來了,因?yàn)閘eft join的關(guān)鍵字在product表不唯一,所以這部分不唯一的數(shù)據(jù)就產(chǎn)生了笛卡爾積,導(dǎo)致執(zhí)行結(jié)果多于預(yù)期結(jié)果。
解決的辦法就是采用唯一鍵去關(guān)聯(lián)做鏈接查詢就可以了
mysql使用left join時(shí),右表數(shù)據(jù)有重復(fù)數(shù)據(jù)
LEFT JOIN 關(guān)鍵字會(huì)從左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。 此時(shí)右表 (table_name2)右表有通過 on 關(guān)鍵字過濾后沒有數(shù)據(jù)或只有一條數(shù)據(jù)時(shí)是沒有問題的。
我要說的是如果右表 (table_name2)出現(xiàn)重復(fù)數(shù)據(jù)(業(yè)務(wù)上完全重復(fù))該怎么處理。
當(dāng)右表 (table_name2)通過 on 關(guān)鍵字過濾后出現(xiàn)重復(fù)數(shù)據(jù),此時(shí)查出的數(shù)據(jù)就會(huì)是,右表數(shù)據(jù)*重復(fù)的數(shù)據(jù)+右表其他條件數(shù)據(jù),和我們所需數(shù)據(jù)的條數(shù)不同。
我的解決方法是,先根據(jù)過濾字段分組查詢一次右表 (table_name2),把相同的數(shù)據(jù)過濾掉,然后把這個(gè)結(jié)果當(dāng)成右表在進(jìn)行關(guān)聯(lián)
前面腦補(bǔ)? LEFT JOIN (SELECT MODEL_CODE,MODEL_NAME from tm_model GROUP BY MODEL_CODE) tm on tav.model_code = tm.MODEL_CODE? 后面腦補(bǔ)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL自動(dòng)為查詢數(shù)據(jù)結(jié)果加序號(hào)
這篇文章主要給大家介紹了關(guān)于MYSQL如何自動(dòng)為查詢數(shù)據(jù)的結(jié)果編上序號(hào)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧2022-12-12詳解MySQL中varchar和int隱式轉(zhuǎn)換的注意事項(xiàng)
這篇文章主要為大家詳細(xì)介紹了MySQL中varchar和int隱式轉(zhuǎn)換的注意事項(xiàng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12mysql 實(shí)現(xiàn)設(shè)置多個(gè)主鍵的操作
這篇文章主要介紹了mysql 實(shí)現(xiàn)設(shè)置多個(gè)主鍵的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02win2008 R2 WEB環(huán)境配置之MYSQL 5.6.22安裝版安裝配置方法
這篇文章主要介紹了win2008 R2 WEB環(huán)境配置之MYSQL 5.6.22安裝版安裝配置方法,需要的朋友可以參考下2016-06-06深入理解MySQL中MVCC與BufferPool緩存機(jī)制
這篇文章主要介紹了深入理解MySQL中MVCC與BufferPool緩存機(jī)制,MySQL默認(rèn)RR隔離級(jí)別就是通過該機(jī)制來保證的MVCC,更多主題相關(guān)內(nèi)容,需要的可以參考下面文章內(nèi)容介紹2022-05-05MySQL數(shù)據(jù)庫(kù)線上修改表結(jié)構(gòu)的方法
MySQL有一個(gè)把鎖,叫做MDL元數(shù)據(jù)鎖,當(dāng)對(duì)表修改的時(shí)候,會(huì)自動(dòng)給表加上這把鎖,也就是不需要自己顯式使用,這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)線上修改表結(jié)構(gòu)的方法,需要的朋友可以參考下2022-09-09