เทคนิคการ Join ข้อมูล ตอนที่ 4
มาต่อกันเลยเกี่ยวกับการ Join ที่มีประสิทธิภาพ
3.หลีกเลี่ยงการใช้งาน LEFT JOIN หรือ RIGHT JOIN โดยไม่จำเป็น เนื่องจากการใช้ LEFT JOIN หรือ RIGHT JOIN เราจะใช้เมื่อพบว่าข้อมูลที่ต้องการอาจมีบางรายการที่ไม่สามารถจับคู่ได้ แต่เราต้องการผลลัพท์ของมันด้วย
ในกรณีข้างบน หากมีรายการใดในตาราง items ที่ไม่ได้กำหนดหมวดหมู่ไว้ ผลลัพท์ของรายการนั้นๆก็ยังจะแสดงออกมา ซึ่งจะแตกต่างจาก INNER JOIN ที่จะคืนค่าเฉพาะรายการที่สามารถจับคู่ได้เท่านั้น แต่มีวิธีนี้มีข้อเสียที่สำคัญก็คือ ในการจับคู่จะมีการกระทำกับทุก Record ก่อน แล้วจึงค่อยนำมาเลือกผลลัพท์ที่ต้องการทีหลัง ซึ่งถ้าข้อมูลที่นำมา JOIN มีเป็นจำนวนมากก็จะใช้เวลาในการประมวลผลนาน
วิธีด้านบนเป็นการแก้ปัญหาในการ JOIN วิธีแรก ด้วยการจำกัดผลลัพท์ให้น้อยลงก่อน ด้วยการคัดเลือกเฉพาะรายการที่ต้องการก่อน แล้วค่อยนำไป JOIN กับตารางอื่นๆ
หากในการ JOIN ต้องการผลลัพท์ที่ต้องการ จากตารางที่นำมา JOIN เพียงฟิลด์เดียว อาจเลือกใช้วิธีของ Subquery แทนได้ครับ
3.หลีกเลี่ยงการใช้งาน LEFT JOIN หรือ RIGHT JOIN โดยไม่จำเป็น เนื่องจากการใช้ LEFT JOIN หรือ RIGHT JOIN เราจะใช้เมื่อพบว่าข้อมูลที่ต้องการอาจมีบางรายการที่ไม่สามารถจับคู่ได้ แต่เราต้องการผลลัพท์ของมันด้วย
SELECT I.item_id,I.detail,G.cat_name
FROM items AS I
LEFT JOIN categories AS C ON C.item_id=I.item_id
LEFT JOIN category AS G ON G.cat_id=C.cat_id
WHERE I.item_id=3
ในกรณีข้างบน หากมีรายการใดในตาราง items ที่ไม่ได้กำหนดหมวดหมู่ไว้ ผลลัพท์ของรายการนั้นๆก็ยังจะแสดงออกมา ซึ่งจะแตกต่างจาก INNER JOIN ที่จะคืนค่าเฉพาะรายการที่สามารถจับคู่ได้เท่านั้น แต่มีวิธีนี้มีข้อเสียที่สำคัญก็คือ ในการจับคู่จะมีการกระทำกับทุก Record ก่อน แล้วจึงค่อยนำมาเลือกผลลัพท์ที่ต้องการทีหลัง ซึ่งถ้าข้อมูลที่นำมา JOIN มีเป็นจำนวนมากก็จะใช้เวลาในการประมวลผลนาน
SELECT Q.item_id,Q.detail,G.cat_name FROM
(SELECT item_id,detail FROM items WHERE item_id=3) AS Q
LEFT JOIN categories AS C ON C.item_id=Q.item_id
LEFT JOIN category AS G ON G.cat_id=C.cat_id
วิธีด้านบนเป็นการแก้ปัญหาในการ JOIN วิธีแรก ด้วยการจำกัดผลลัพท์ให้น้อยลงก่อน ด้วยการคัดเลือกเฉพาะรายการที่ต้องการก่อน แล้วค่อยนำไป JOIN กับตารางอื่นๆ
SELECT Q.item_id,Q.detail
,(SELECT cat_name FROM category WHERE cat_id=(
SELECT cat_id FROM categories WHERE item_id=Q.item_id LIMIT 1
) LIMIT 1) AS cat_name
FROM (SELECT item_id,detail FROM items WHERE item_id=1) AS Q
หากในการ JOIN ต้องการผลลัพท์ที่ต้องการ จากตารางที่นำมา JOIN เพียงฟิลด์เดียว อาจเลือกใช้วิธีของ Subquery แทนได้ครับ