MySQL在右表數(shù)據(jù)不唯一的情況下使用left join的方法
1.left join 基本用法
mysql left join 語句格式
A LEFT JOIN B ON 條件表達式
left join 是以A表為基礎(chǔ),A表即左表,B表即右表。
左表(A)的記錄會全部顯示,而右表(B)只會顯示符合條件表達式的記錄,如果在右表(B)中沒有符合條件的記錄,則記錄不足的地方為NULL。
例如:news 與 news_category表的結(jié)構(gòu)如下,news表的category_id與news_category表的id是對應(yīng)關(guān)系。
news 表

news_category 表

顯示news表記錄,并顯示news的category名稱,查詢語句如下
select a.id,a.title,b.name as category_name,a.content,a.addtime,a.lastmodify from news as a left join news_category as b on a.category_id = b.id;
查詢結(jié)果如下:

因 news_category 表沒有id=4的記錄,因此news 表中category_id=4的記錄的category_name=NULL
使用left join, A表與B表所顯示的記錄數(shù)為 1:1 或 1:0,A表的所有記錄都會顯示,B表只顯示符合條件的記錄。
2.left join 右表數(shù)據(jù)不唯一解決方法
但如果B表符合條件的記錄數(shù)大于1條,就會出現(xiàn)1:n的情況,這樣left join后的結(jié)果,記錄數(shù)會多于A表的記錄數(shù)。
例如:member與member_login_log表的結(jié)構(gòu)如下,member記錄會員信息,member_login_log記錄會員每日的登入記錄。member表的id與member_login_log表的uid是對應(yīng)關(guān)系。
member 表

member_login_log 表

查詢member用戶的資料及最后登入日期:
如果直接使用left join
select a.id, a.username, b.logindate from member as a left join member_login_log as b on a.id = b.uid;
因member_login_log符合條件的記錄比member表多(a.id = b.uid),所以最后得出的記錄為:

但這并不是我們要的結(jié)果,因此這種情況需要保證B表的符合條件的記錄是空或唯一,我們可以使用group by來實現(xiàn)。
select a.id, a.username, b.logindate from member as a left join (select uid, max(logindate) as logindate from member_login_log group by uid) as b on a.id = b.uid;

總結(jié):使用left join的兩個表,最好是1:1 或 1:0的關(guān)系,這樣可以保證A表的記錄全部顯示,B表顯示符合條件的記錄。
如果B表符合條件的記錄不唯一,就需要檢查表設(shè)計是否合理了。
- 圖文詳解Mysql使用left?join寫查詢語句執(zhí)行很慢問題的解決
- mysql使用left?join連接出現(xiàn)重復(fù)問題的記錄
- MySQL中多個left?join?on關(guān)聯(lián)條件的順序說明
- 關(guān)于mysql?left?join?查詢慢時間長的踩坑總結(jié)
- MYSQL Left Join優(yōu)化(10秒優(yōu)化到20毫秒內(nèi))
- 解決Mysql的left join無效及使用的注意事項說明
- mysql left join快速轉(zhuǎn)inner join的過程
- mysql高效查詢left join和group by(加索引)
- 詳解mysql 使用left join添加where條件的問題分析
- mysql中l(wèi)eft join設(shè)置條件在on與where時的用法區(qū)別分析
- MySQL 8.0.18 Hash Join不支持left/right join左右連接問題
- MySQL left join操作中on和where放置條件的區(qū)別介紹
- mysql多個left join連接查詢用法分析
- MySQL利用profile分析慢sql詳解(group left join效率高于子查詢)
- MySQL表LEFT JOIN左連接與RIGHT JOIN右連接的實例教程
- mysql left join的基本用法以及on與where的區(qū)別
相關(guān)文章
MySQL安裝出現(xiàn)starting the server報錯的解決方案
如果電腦是第一次安裝MySQL,一般不會出現(xiàn)這樣的報錯,如下圖所示,本文主要介紹了MySQL安裝出現(xiàn)starting the server報錯的解決方案,感興趣的可以了解一下2024-07-07
MySQL主從復(fù)制之半同步semi-sync?replication
這篇文章主要介紹了MySQL主從復(fù)制之半同步semi-sync?replication,半同步相對于異步復(fù)制而言,提高了數(shù)據(jù)的安全性,同時也造成了一定程度的延遲,這個延遲最少是一個TCP往返的時間。所以,半同步復(fù)制最好在低延時的網(wǎng)絡(luò)中使用,下文詳細內(nèi)容,需要的小伙伴可以參考一下2022-02-02
CentOS系統(tǒng)下如何設(shè)置mysql每天自動備份
備份是容災(zāi)的基礎(chǔ),是指為防止系統(tǒng)出現(xiàn)操作失誤或系統(tǒng)故障導(dǎo)致數(shù)據(jù)丟失,而將全部或部分數(shù)據(jù)集合從應(yīng)用主機的硬盤或陣列復(fù)制到其它的存儲介質(zhì)的過程。本文將詳細介紹在CentOS系統(tǒng)下如何設(shè)置mysql每天自動備份,有需要的朋友們下面來一起看看吧。2016-10-10
Mysql之索引的數(shù)據(jù)結(jié)構(gòu)詳解
索引是存儲引擎用于快速找到數(shù)據(jù)記錄的一種數(shù)據(jù)結(jié)構(gòu),類似于教科書的目錄部分,在MySQL中,索引可以加速數(shù)據(jù)查找,減少磁盤I/O的次數(shù),提高查詢速率,但是,創(chuàng)建和維護索引需要耗費時間,并且索引需要占磁盤空間,在InnoDB中,索引的實現(xiàn)基于B+樹結(jié)構(gòu)2024-12-12
mysql5.7.19 解壓版安裝教程詳解(附送純凈破解中文版SQLYog)
Mysql5.7.19版本是今年新推出的版本,最近幾個版本的MySQL都不再是安裝版,都是解壓版了,大家在使用過程中遇到很多問題,下面小編給大家?guī)砹薓ySQL5.7.19 解壓版安裝教程詳解,感興趣的朋友一起看看吧2017-10-10

