0%

SQL_join

前言

簡單理解 Inner join、 Left join 的差別。 以及使用經驗分享。

WHY

  1. 班上國文80分以上,但數學不及格的同學有哪些
  2. Shiva 的魔法商店中,使用者 Sarah 沒有買過的商品有哪些

WHAT


Left join

會先取得所有的 A,
那如果沒有相對應的 B ,就直接全部塞 null ,
他的邏輯就是抓取,『所有的課(A)加上修課學生的資料(B)』


參考


牛刀小試

Question

  1. 有修演算法,也有修人機互動課程的同學有哪些(A:演算法名單,B: 人機互動名單)
  2. 班上國文和數學都80分以上同學有哪些(A:國文80分以上名單,B: 數學80分以上名單)
  3. 班上國文80分以上,但數學不及格的同學有哪些(A:國文分數表,B: 數學及格的名單)
  4. 請列出魔法店中,Sarah 已經買過的商品(A:有賣的商品列表, B:Sarah買過的商品列表)
  5. 請列出魔法店中的所有魔法,並標記 Sarah 還沒買過的商品(A: 魔法店的商品列表, B: Sarah買過的商品)

Answer

  1. inner join
  2. inner join
  3. left exclusive join
  4. inner join
  5. left inclusive join

HOW

1
2
3
4
5
6
7
8
$magics = ShopMagic::where(['shop_id' => $id])
->join('magics','shop_magics.magic_id', '=', 'magics.id')
->leftjoin('user_magics', function($join){
$join->where('user_magics.user_id','=', Auth::user()->id)
->on('shop_magics.magic_id', '=', 'user_magics.magic_id');
})
->select('magics.id','magics.name','magics.price','magics.level','user_magics.magic_id')
->get();