首頁 >資料庫 >mysql教程 >mysql中inner join和left join如何使用

mysql中inner join和left join如何使用

WBOY
WBOY轉載
2023-06-01 19:37:251006瀏覽

區別

返回不同
1、inner join只回傳兩個表中聯結字段相等的行
2、left join的數量小於等於左表和右表中的記錄數量。

數量不同
1、inner join傳回包含左表中的所有記錄和右表中聯結欄位相等的記錄。
2、left join的數量以左表中的記錄數量相同

記錄屬性不同
1、inner join不足的記錄屬性會被直接捨棄
# 2、left join不足的記錄屬性用NULL填充

inner join 場景

設計兩張表:

  • channel 頻道表:有頻道id 、頻道name等

  • module 模組表:模組id、模組name、channe_id。

頁面展示頻道時,可能會有新增了一個頻道但是沒有模組,此時不能用inner join 不然新增的模組查詢不出來,所以用left join

 select channel.* from  channel left join modules on channel.id = modules.channel_id
 where page_id=1
 group by channel.id order by channel.new_sort asc , channel.id desc

1、page_id是指在哪個頁面類型下,在頻道channel表中定義,用來區分哪個頁類型
2、一個頻道id可能有多個模組去關聯,所以需要依照頻道id進行分組
3、new_sort可以設定頻道的排序顯示,另外排序相同應該讓頻道先建立的顯示在前面。

以下這種情況新建立的頻道就不會顯示,也沒有模組的頻道也不會顯示。

select channel.*  from channel inner join modules on channel.id=modules.channel_id
where page_id=1 group by channel.id order by channel.new_sort asc , channel.id desc

最後:有點疑問,頻道只做顯示頻道相關信息,並沒有用到關聯的模組信息,所以感覺這樣也能滿足需求了。後續發現問題再更吧

 select channel.* from  channel
 where page_id=1 order by channel.new_sort asc , channel.id desc

額~補充問題,上面遺留的問題是頁面上需要查詢module的id所以才關聯了。

之前還遇到了個inner join 的場景,後續再補~

inner join 場景

新加一個策略表policy_lib 、然後再建立一個中間表channel_policy記錄channel頻道和policy_lib策略表關聯。
那麼顯然sql這樣寫

select policy_lib.id,channel_policy.policy_id,channel_policy.channel_id,channel.id  from policy_lib inner join channel_policy on channel_policy.policy_id=policy_lib.id 
inner join channel on channel.id=channel_policy.channel_id

使用inner join 顯然結果查詢出來不會有空的情況,如果用left join 萬一表中有髒數據,左邊有數據右邊時空的,在處理的時候還需要考慮是否有空的情況顯然不合理。

以上是mysql中inner join和left join如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除