1. 程式人生 > >mysql 中 left join 出現的結果會重複的問題

mysql 中 left join 出現的結果會重複的問題

簡單說明問題出現的原因:
MySQL left join 語句格式為: A LEFT JOIN B ON 條件表示式

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

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

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

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

所以解決辦法 都是從一個出發點出發,使A表與B表所顯示的記錄數為 1:1對應關係。

解決方法:
使用非唯一標識的欄位做關聯
1
select DISTINCT(id) from a left join b on a.id=b.aid DISTINCT查詢結果是 第一個表唯一的資料 重複的結果沒顯示出來

2
select * from a left join(select id from b group by id) as b on a.id=b.aid 拿出b表的一條資料關聯 使A表與B表所顯示的記錄數為 1:1對應關係。

3
select * from a left join (select max(id) from table group by id) as b on a.id=b.aid 拿出b表的最後一條資料關聯

PS:
1,解釋distinct,如下例子:(**
table
id name
1 a
2 b
3 c
4 c
5 b

比如想用一條語句查詢得到name不重複的所有資料,那就必須使用distinct去掉多餘的重複記錄。

select distinct name from table
得到的結果是:

name
a
b
c

好像達到效果了,可是,如果還想要得到的是id值呢?改一下查詢語句吧:

select distinct name, id from table

結果會是:

id name
1 a
2 b
3 c
4 c
5 b

distinct怎麼沒起作用?作用是起了的,不過他同時作用了兩個欄位,也就是必須得id與name都相同的才會被排除

採用唯一鍵去關聯做連結查詢
left join的關鍵字(欄位)在product表不唯一,所以這部分不唯一的資料就產生了笛卡爾積,導致執行結果多於預期結果。可以用唯一鍵(不一定要主鍵,只要唯一就行)去關聯做連結查詢就可以了。