mysql left join 左連線查詢關聯n多張表
阿新 • • 發佈:2019-01-24
最近用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,才不容易出錯。