PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum

การใช้งาน SQL LEFT JOIN

19 September 2014 By


ก่อนเข้าตัวอย่างการใช้งาน LEFT JOIN มาดูรูปแบบของ join condition ทั้งสอง
รูปแบบกันก่อน 
 
ON conditional_expr
และ
USING (column_list)
 
ON ใช้เปรียบเทียบ column แบบทั่วไป โดยชื่อ column จะเป็นชื่อเดียวกันหรือคนละ
ชื่อก็ได้ เช่น
 
SELECT
a.cus_id,a.cus_name,b.cusID,b.order_id,b.pro_id
FROM tbl_customer a LEFT JOIN tbl_order b
ON a.cus_id=b.cusID
 
โดยที่ cus_id ของตาราง tbl_customer มีค่าเดียวกันกับ cusID ของตาราง tbl_order
แต่มีการกำหนดชื่อ column ไม่เหมือนกัน
อย่างไรก็ตาม กรณีที่ชื่อ column ที่กำหนดเหมือนกัน ก็สามารถใช้ ON ได้
 
ส่วนสำหรับการใช้งาน  USING (column_list)
จะเหมาะสำหรับกรณี สองตารง มีการกำหนด ชื่อ column เหมือนกัน ดังนั้นการ
เปรียบเทียบค่า เช่น ON a.cus_id = b.cus_id เราสามารถแทนได้ด้วย USING(cus_id)
 
SELECT
a.cus_id,a.cus_name,b.cus_id,b.order_id,b.pro_id
FROM tbl_customer a LEFT JOIN tbl_order b
USING(cus_id)
 
 
ตารางฐานข้อมูลประกอบการอธิบาย
 
tbl_customer
tbl_order
tbl_product
cus_id cus_name
1 Cus A
2 Cus B
3 Cus C
4 Cus D
5 Cus E
order_id cus_id pro_id
1 1 3
2 2 3
3 1 4
4 3 5
5 1 5
6 3 5
7 5 2
8 5 4
9 3 2
10 5 5
pro_id pro_name pro_price
1 Pro 111 100
2 Pro 222 200
3 Pro 333 100
4 Pro 444 250
5 Pro 555 400
 
การใช้งาน LEFT jOIN ตามความเข้าใจก็คือ การโฟกัสไปที่ตารางด้านซ้าย
 
FROM tbl_customer a LEFT JOIN tbl_order b

 
แบบนี้คือโฟกัสไปที่ตารางชื่อ tbl_customer
 
หมายเหตุ เผื่อใคร ไม่เข้าใจว่า a กับ b ที่ต่อท้ายชื่อตารางหมายถึงอะไร 
ตัว a กับ b ใช้สำหรับเป็นชื่ออ้างอิงตาราง เรากำหนดเป็นตัวอะไรอักษร หรือคำ
ใดก็ได้ ตามความเหมาะสมและเข้าใจ เวลาเราเขียนคำสั่ง query เรียกดูข้อมูล
column ต่าง ๆ จะได้เขียนย่อ หรือเขียนสั้นลงกว่าเดิม
 
//จาก

SELECT
tbl_customer.cus_id,tbl_customer.cus_name,
tbl_order.cus_id,tbl_order.order_id,tbl_order.pro_id
FROM tbl_customer LEFT JOIN tbl_order

// ใช้เป็น

SELECT
a.cus_id,a.cus_name,b.cus_id,b.order_id,b.pro_id
FROM tbl_customer a LEFT JOIN tbl_order b
 
 
การโฟกัสไปที่ตารางชื่อ tbl_customer หมายถึง ข้อมูลที่อยู่ในตาราง 
tbl_customer จะถูกนำมาแสดงทั้งหมด ทั้งที่จะสัมพันธ์หรือไม่สัมพันธ์ กับตาราง
tbl_order หรือไม่ก็ตาม

// เงื่อนไข เราต้องการดึง ข้อมูล ดูว่าลูกค้าแต่ละคนในตาราง tbl_custoemr
// มีรายการสั่งซื้อสินค้า tbl_order อะไรบ้าง
SELECT
a.cus_id,a.cus_name,b.order_id,b.pro_id
FROM tbl_customer a LEFT JOIN tbl_order b
USING(cus_id)

จะเห็นว่า ลูกค้าที่มี cus_id=4 ซึ่งไม่มีรายการสั่งซื้อใดๆ เลย 
ค่าในตาราง tbl_order เท่ากับ nulll หรือค่าว่าง
ก็จะแสดงข้อมูลลูกค้า ซึ่งต่างจากการใช้งาน inner join ที่ไม่แสดงลูกค้า cus_id=4
ทั่้งนี้ก็เป็นเพราะ การใช้งาน left join จะโฟกัสไปที่ตารางด้านซ้ายนั่นเอง
// ดังนั้นการใช้งาน left join คือการดึงข้อมูลจากสองตาราง โดยโฟกัสไปที่ตารางด้านซ้าย
// จากผลลัพธ์ เนื่องจากตาราง tbl_order ไม่มีรายการสั่งซื้อของลูกค้า cus_id=4
// ผลของคำสั่ง left join จึงทำให้ค่าของข้อมูลในตาราง tbl_order เท่ากับ nulll หรือค่าว่าง
// ถ้าเปรียบเทียบ สอง ตาราง การใช้งาน left join ข้อมูลที่ได้ 
// จากตาราง A และ B คือ ตำแหน่ง A และ C หรือ 
// ก็คือตำแหน่ง A ทั้งหมด กับตำแหน่ง B บางส่วน
// นั่นก็คือข้อมูลตาราง A ต้องมีทั้งหมด ข้อมูลตาราง B จะมีเป็นบางส่วนหรือทั้งหมดก็ได้
// ขึ้นกับข้อมูล 
A
B
C






// ลองมาดูแบบ 3 ตาราง  tbl_customer a LEFT JOIN (tbl_order b,tbl_product c)
// เราโฟกัสไปที่ตาราง จากซ้าย ไปขวา ก็คือ   tbl_customer และ tbl_order 
// เงื่อนไข เราต้องการดึง ข้อมูล ดูว่าลูกค้าแต่ละคน
// มีรายการสั่งซื้อสินค้าอะไรบ้าง โดยแสดงชื่อสินค้าด้วย
// ผลที่ได้จะเหมือนกับตัวอย่างด้านบน แต่มีชื่อของสินค้า จากการเพิ่มตารางเข้ามา
SELECT
a.cus_id,a.cus_name,b.order_id,b.pro_id,c.pro_name
FROM tbl_customer a LEFT JOIN (tbl_order b,tbl_product c)
ON (a.cus_id=b.cus_id AND b.pro_id=c.pro_id)

// ดูตัวอย่างเพิ่มเติม
// เงื่อนไขคือ อยากรู้ว่า ลูกค้าแต่ละคนซื้อไปคนละกี่รายการ และมียอดสั่งซื้อคนละเท่าไหร่
SELECT
a.cus_id,a.cus_name,COUNT(b.order_id) quantity,SUM(c.pro_price) amount
FROM tbl_customer a LEFT JOIN (tbl_order b,tbl_product c)
ON (a.cus_id=b.cus_id AND b.pro_id=c.pro_id)
GROUP BY a.cus_id
ORDER BY a.cus_id

// ถ้าอยากให้รายการที่ null แสดงค่าเท่ากับ 0 ให้ใช้      
SELECT
a.cus_id,a.cus_name,COUNT(b.order_id) quantity,
IFNULL(SUM(c.pro_price),0) amount
FROM tbl_customer a LEFT JOIN (tbl_order b,tbl_product c)
ON (a.cus_id=b.cus_id AND b.pro_id=c.pro_id)
GROUP BY a.cus_id
ORDER BY a.cus_id

// ถ้าอยากให้รายการที่ null แสดงค่าเท่ากับ 0 และเป็นประเภทตัวเลข ให้ใช้
SELECT
a.cus_id,a.cus_name,COUNT(b.order_id) quantity,
IFNULL(CAST(SUM(c.pro_price) as UNSIGNED),0) amount
FROM tbl_customer a LEFT JOIN (tbl_order b,tbl_product c)
ON (a.cus_id=b.cus_id AND b.pro_id=c.pro_id)
GROUP BY a.cus_id
ORDER BY a.cus_id






เนื้อหาที่เกี่ยวข้อง



Tags:: sql left join





URL สำหรับอ้างอิง