mysql left join 右表資料不唯一的情況解決方案,mysqljoin

來源:互聯網
上載者:User

mysql left join 右表資料不唯一的情況解決方案,mysqljoin
1.left join 基本用法


mysql left join 語句格式

A LEFT JOIN B ON 條件運算式


left join 是以A表為基礎,A表即左表,B表即右表。

左表(A)的記錄會全部顯示,而右表(B)只會顯示符合條件運算式的記錄,如果在右表(B)中沒有合格記錄,則記錄不足的地方為NULL。


例如:newsnews_category表的結構如下,news表的category_id與news_category表的id是對應關係。


news 表

id title category_id content addtime lastmodify
1 fashion news title 1 fashion news content 2015-01-01 12:00:00 2015-01-01 12:00:00
2 sport news title 2 sport news content 2015-01-01 12:00:00 2015-01-01 12:00:00
3 life news title 3 life news content 2015-01-01 12:00:00 2015-01-01 12:00:00
4 game news title 4 game news content 2015-01-01 12:00:00 2015-01-01 12:00:00






news_category 表

id name
1 fashion
2 sport
3 life





顯示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;


查詢結果如下:

id title category_name content addtime lastmodify
1 fashion news title fashion fashion news content 2015-01-01 12:00:00 2015-01-01 12:00:00
2 sport news title sport sport news content 2015-01-01 12:00:00 2015-01-01 12:00:00
3 life news title life life news content 2015-01-01 12:00:00 2015-01-01 12:00:00
4 game news title NULL game news content 2015-01-01 12:00:00 2015-01-01 12:00:00






news_category 表沒有id=4的記錄,因此news 表中category_id=4的記錄的category_name=NULL


使用left join, A表與B表所顯示的記錄數為 1:1 或 1:0,A表的所有記錄都會顯示,B表只顯示合格記錄。


2.left join 右表資料不唯一解決方案


如果B表合格記錄數大於1條,就會出現1:n的情況,這樣left join後的結果,記錄數會多於A表的記錄數


例如:membermember_login_log表的結構如下,member記錄會員資訊,member_login_log記錄會員每日的登入記錄。member表的id與member_login_log表的uid是對應關係。


member 表

id username
1 fdipzone
2 terry




member_login_log 表

id uid logindate
1 1 2015-01-01
2 2 2015-01-01
3 1 2015-01-02
4 2 2015-01-02
5 2 2015-01-03







查詢member使用者的資料及最後登入日期:

如果直接使用left join

select a.id, a.username, b.logindatefrom member as a left join member_login_log as b on a.id = b.uid;

因member_login_log合格記錄比member表多(a.id = b.uid),所以最後得出的記錄為:

id username logindate
1 fdipzone 2015-01-01
1 fdipzone 2015-01-02
2 terry 2015-01-01
2 terry 2015-01-02
2 terry 2015-01-03







但這並不是我們要的結果,因此這種情況需要保證B表的合格記錄是空或唯一,我們可以使用group by來實現。

select a.id, a.username, b.logindatefrom member as a left join (select uid, max(logindate) as logindate from member_login_log group by uid) as bon a.id = b.uid;


id username logindate
1 fdipzone 2015-01-02
2 terry 2015-01-03




總結:使用left join的兩個表,最好是1:1 或 1:0的關係,這樣可以保證A表的記錄全部顯示,B表顯示合格記錄。

如果B表合格記錄不唯一,就需要檢查表設計是否合理了。


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.