1. 程式人生 > >mysql left join 左連線查詢關聯n多張表

mysql left join 左連線查詢關聯n多張表

最近用mysql 多表關聯查詢比較多,特此總結一下left join用法,拓展下left join將多表關聯。

left join 左連線即以左表為基準,顯示座標所有的行,右表與左表關聯的資料會顯示,不關聯的則不顯示。關鍵字為left join on。
**基本用法如下:
select table a left join table b on a.id = b.ta_id**

注意:1⃣️其中on後面關聯的欄位應該是同一欄位(兩表關聯的外來鍵)
2⃣️由於以左表為基準,左表一條記錄如果對應右表多條記錄,那查出的資料中右表的資料也只顯示一條,如果要都顯示,可以用group_contact()將欄位用逗號隔開顯示在一條記錄上。所以右表不管有幾張,如果和左表都是一對一關係,則沒問題,存在一對多關係時,需要一定的處理。

三表關聯 則如下:
select table a left join table b(left join table c on b.id = c.tb_id) on a.id = b_ta.id

再拓展一下,如果關聯七八張表,就像下面這條sql,用法其實無非就像三表關聯一樣,一層套一層,只不過關係要理順好。

SELECT
    GROUP_CONCAT(u.stuffName),
    GROUP_CONCAT(ee.id),
    ee.applyTime,
    p.orderState,
    GROUP_CONCAT(
        concat(
            s.departureAirportCode
, '-', s.landingAirportCode ) ), p.pnr, sns.c, sns.b, sns.a, ee.pnr newp, GROUP_CONCAT( CONCAT( s.departureDate, ' ', s.departureTime ) ), GROUP_CONCAT(s.flightNum), GROUP_CONCAT(s.seatClass
), c.rebookintSumFee, c.customerRebookintFee, c.amountReceivable, o.orderNum, comp.companycode, comp.companyName FROM endrose ee LEFT JOIN passenger p ON ee.passengerId = p.id LEFT JOIN segment s ON s.endroseId = ee.id LEFT JOIN costfee c ON c.endroseId = ee.id LEFT JOIN( SELECT ns.passengerId, GROUP_CONCAT(ns.flightNum)b, GROUP_CONCAT(ns.seatClass)a, GROUP_CONCAT( CONCAT( ns.departureDate, ' ', ns.landingDate ) )c FROM segment ns WHERE ns.orderState = 0 GROUP BY ns.passengerId )sns ON sns.passengerId = ee.passengerId LEFT JOIN( passenger passe LEFT JOIN airticketorder o ON passe.orderId = o.id )ON passe.id = ee.passengerId LEFT JOIN( passenger pass LEFT JOIN `user` u ON pass.stuffUUID = u.id )ON pass.id = ee.passengerId LEFT JOIN( passenger passen LEFT JOIN( airticketorder ao left join( `user` ua left join company comp on comp.id = ua.companyId )ON ao.bookerstuffId = ua.id ) ON passen.orderId = ao.id ) ON passen.id = ee.passengerId group by ee.applyTime

這條sql中尤其是最後一個left join,關聯了好幾張表,要好好理順才行。
寫的時候從外層往裡寫,一層一層left join,才不容易出錯。