MySQL多張表關聯查詢

2021-08-02 16:52:20 字數 2095 閱讀 9328

工作中遇到的問題,其實也不算難,最多算是複雜了一丟丟。有四張表,a,b,c,d;

假設:

a:商戶表,有欄位code;

b:商戶普通使用者表,也有字段code;ps:code是關聯著三張表的重要字段;

c:商戶會員表,沒有與其關聯的code,但是有card_code欄位與d表中的card_code關聯;

d:會員卡表;

當然,每張表的字段絕對不止這些!

目的是查詢到推薦商戶,就是is_recommend欄位標識的商戶,並且要查出他的普通使用者與會員所享有的折扣率,即是discount_rate欄位;但是其中會員的折扣資訊在d表會員卡表中;並且有些會員已經不享受折扣(status標識)。

1.要查詢出所有推薦商戶,無論其折扣是否存在,都要把商戶name,shop_type等有用資訊查詢出來;

2.一次性查出所有資訊。

剛開始沒有注意到無論折扣資訊是否存在,都需要查出shop資訊的條件,所以sql是這麼寫的:

select a.code,a.name,a.shop_type,b.discount_rate as b_rate,d.discount_rate as d_rate  from a a,b b,c c,d d where a.code=b.shop_code and a.code=c.shop_code and c.card_code=d.card_code and a.is_recommend='y'

and b.status!='n'

and c.status!='n'

;

執行後發現,根本不是自己想要的資料!當折扣資訊不存在的時候,所查詢的商戶資訊也就不存在了!

接下來,就想到了表連線;以a表為基準,這樣查出來的資料無論有沒有折扣資訊,商戶資訊都會查出來:

select a.code,a.name,a.shop_type,b.discount_rate as b_rate,d.discount_rate as d_rate  from a a left

join b b on a.code=b.shop_code left

join (c c left

join d d on c.card_code=d.card_code) on a.code=c.shop_code where a.is_recommend='y'

and b.status!='n'

and c.status!='n' ;

完成後,欣喜若狂!然而打擊又來了,在不加where條件的時候,結果還是我預期的,當加上where條件,則:和剛開始寫的sql出現一樣的問題,該出現的商戶資訊消失了!真是百思不得其解!

最後,感覺where條件應該加在left join … on 的後邊,即是:

select a.code,a.name,a.shop_type,b.discount_rate as b_rate,d.discount_rate as d_rate  from a a left

join b b on a.code=b.shop_code and b.status='y'

left

join (c c left

join d d on c.card_code=d.card_code and c.status!='n') on a.code=c.shop_code where a.is_recommend='y';

最終版本就是這樣。我相信這肯定不是最優的sql**,學無止境!共同進步!更像引用一句前輩的話:理論不懂就實踐,實踐不會就學理論!

mysql關聯查詢去重 MySQL 關聯查詢

mysql 關聯查詢 sql資料分析 1週前 mysql 關聯查詢 前面,我們介紹的都是單錶查詢 就是只從一張表中獲取資料 而實際應用的時候,我們都會同時查詢多張表,這裡,我們就介紹下,多表關聯查詢的使用。sql join 用於根據兩個或多個表中的列之間的關係,從這些表中查詢資料 前置知識 主鍵 p...

表關聯查詢

一 內連線和外連線 內連線用於返回滿足連線條件的記錄 而外連線則是內連線的擴充套件,它不僅會滿足連線條件的記錄,而且還會返回不滿足連線條件的記錄,語法如下 oracle 1.select table1.column,table2.column from table1 inner left right...

表關聯查詢

一 表關聯查詢 1.表的關聯分兩類 有關係的關聯 無關係的關聯 2.表的有關係的關聯 內關聯 where 指定關聯關係 表1.欄位 表2.欄位 and 表2.欄位 表3.欄位 有關係關聯 通過字段關係,把多張表合併在一起.select s emp.id,first name,name from s ...