1. 程式人生 > 資料庫 >Mysql中關於表與表之間連線查詢的問題

Mysql中關於表與表之間連線查詢的問題

三種連線方式

一對一:兩張表為一一對應的關係,如編號01在表1與表2中僅有一條記錄,現實中極為少見

一對多:如編號01在表1中出現一條記錄,而在表2中出現2條甚至多條記錄,現實業務中較常見

多對多:顧名思義,同一個編號在兩張表中各出現1次以上的記錄,業務中少見,個人經驗,若採取此種方式連線查詢會導致重複計算,與實際業務情況不符,產生錯誤。

針對多對多情況,舉例說明:
電商資料ER圖
題目:讓求出購買力最強的前十個城市
出現city的表為orderinfo和useraddress,兩張表之間通過userinfo的userid可對應起來,注意圖中箭頭指向為多,即userinfo的使用者(userid)為一,在orderinfo中可有多筆訂單orderid,則userid為了跟orderid對應上,會出現多次;同理,一個userid也可在useraddress中有多個收件地址,有幾個收件地址出現幾個對應的userid。實際上orderinfo中的使用者、地址與useraddress中的相同,若orderinfo與useraddress通過共有欄位userid連線查詢,屬於典型的多對多連線,orderinfo中每一條相同的userid記錄會分別與useraddress中相同userid所有的記錄連線,即交叉重複連線,地址相同與地址不同的都會對應連線一次,結果與實際不符,出錯。直接通過orderinfo查詢即可,詳見程式碼:

select b.city,sum(OrderAmount) c from orderinfo a join
	useraddress b on a.userid=b.userid  	-- 錯誤寫法,此為多對多,重複計算
    group by b.city
    order by c desc
    limit 10;

結果如下:
在這裡插入圖片描述

--正確寫法:
select city,sum(OrderAmount) c from orderinfo
    group by city
    order by c desc
    limit 10;

結果如下:
在這裡插入圖片描述