Thaimisc.com : PHP กับฐานข้อมูล MySQL (26)
ThaiMisc.Com : Free Webboard | Free GuestBook | Free Poll | Free Ecard Server | Free Java Chat Room | Advertising | Contact Us | Colocation | Web Hosting | เปิดร้านค้าฟรี


Category : Php Developer Print Article Only Print Aticle With Comment
PHP กับฐานข้อมูล MySQL (26)
เขียนโดย เดอะกาฝากไดอารี่ (ball@bbznet.com) , 28-07-2004
เมื่อวานโดนสถานการณ์ตรอกข้าวสารทำให้การอัพเดตเนื้อหาชะงัก แต่จริงๆ ก็อัพเดตได้ยาวพอสมควรละครับ เลยคิดว่าสมควรแก่การไปเดินซื้อหาของ... อุตส่าห์ถ่อไปไกลถึงตรอกข้าวสาร แต่ฝนก็ตก แถมเดินทั้งตรอก ได้กางเกงขาสั้นมาตัวเดียว คุ้มจริงๆ -_-'' เอาเหอะๆ ถือซะว่าไปเปิดหูเปิดตาตอนกลางคืนที่นานๆ จะได้ไปซะที

เอาละครับ มาว่ากันต่อ... ในตอนที่แล้วผมได้หยุดเอาไว้ถึงตรงที่ตัวอย่างของการดึงข้อมูลที่มีการอ้างอิงถึงหลายตาราง แต่ค่อยๆ ดึงออกมาทีละตาราง จะเห็นได้ว่าโค้ดที่เขียนออกมาค่อนข้างจะซับซ้อน ยิ่งถ้ามีการอ้างอิงถึงมากตารางเท่าไหร่ ก็จะยิ่งซับซ้อนมากเท่านั้น... เลี่ยงได้ก็ควรเลี่ยงดีกว่าครับ แม้ว่าในความเป็นจริงแล้ว ฐานข้อมูลที่ถูกออกแบบมาดี ก็ไม่ควรจะมีการอ้างอิงถึงตารางให้มากจนเกินไปก็เถอะ

คราวนี้เราจะมาลองเขียนโค้ด PHP สำหรับดึงข้อมูลออกมาเหมือนกับโค้ดในตอนที่แล้ว แต่จะใช้วิธีสืบค้นพร้อมกันหลายตารางในคราวเดียว โดยใช้คุณสมบัติ INNER JOIN ของคำสั่ง SQL กันครับ แล้วดูว่ามันทำให้โค้ดซับซ้อนน้อยกว่าขนาดไหน

<?php

//คราวนี้ลองแบบ INNER JOIN กันบ้าง
$conn = mysql_connect("localhost", "root", ""); //เชื่อมต่อกับฐานข้อมูล
mysql_select_db("company"); //เลือกใช้ฐานข้อมูลชื่อ company
$sql = "SELECT * FROM employee";
$sql .= " INNER JOIN position_mstr ON (employee.pos_id = position_mstr.pos_id)";
$sql .= " INNER JOIN department_mstr ON (employee.dept_id = department_mstr.dept_id)";
$result = mysql_query($sql);
while ($data = mysql_fetch_array($result)) {

echo $data['eid']. ":". $data['name']. ":". $data['pos_name']. ":". $data['dept_name']. ":". $data['salary']. "<br>";

}

?>

สังเกตนิดหนึ่งว่าผมแยกเขียนคำสั่ง SQL ออกเป็น 3 บรรทัด เพื่อให้อ่านได้สะดวกนะครับ แต่ทุกบรรทัดจะเป็นการพูดถึงตัวแปร $sql เหมือนกัน แต่จะต่างกันตรง บรรทัดแรกจะเป็น $sql = ใช่ไหมครับ แต่ต่อมาผมจะใช้ $sql .= นั่นหมายความเดียวกับ $sql = $sql. "ข้อความต่อเนื่อง" ครับฃ

เช่น

$a = "ทดสอบ";
$a = $a. "การเขียนข้อความต่อเนื่อง";

กับ

$a = "ทดสอบ";
$a .= "การเขียนข้อความต่อเนื่อง";

จะได้ผลลัพธ์เมื่อทำการ echo $a; เหมือนกันครับ คือเราจะได้ข้อความว่า ทดสอบการเขียนข้อความต่อเนื่อง เหมือนกัน

เอาละ... ทีนี้เรามาดูโค้ดที่เขียนขึ้นดีกว่าครับ สังเกตว่าเราจะได้เหมือนกับการสืบค้นทีละตารางๆ เลยทีเดียว

เห็นไหมครับ... โค้ด PHP จะไม่ซับซ้อนด้วย เพราะไม่ต้องมาวนลูปหลายรอบเพื่อที่จะให้ได้มาซึ่งข้อมูลที่ครบถ้วน และเวลาที่จะแก้ไขอะไร ก็ไปแก้ที่คำสั่ง SQL หลักเพียงอันเดียวครับ

LEFT JOIN
จริงๆ แล้ว INNER JOIN กับ LEFT JOIN นั้นก็ไม่แตกต่างกันหรอกครับ ประมาณว่าเปลี่ยนจากคำว่า INNER เป็น LEFT เท่านั้นเอง เอิ๊กๆ ดังนั้นโค้ดที่เขียนด้วย INNER JOIN ในหัวข้อข้างต้น เรานำมาแก้เป็น

<?php

//คราวนี้ลองแบบ LEFT JOIN กันบ้าง
$conn = mysql_connect("localhost", "root", ""); //เชื่อมต่อกับฐานข้อมูล
mysql_select_db("company"); //เลือกใช้ฐานข้อมูลชื่อ company
$sql = "SELECT * FROM employee";
$sql .= " LEFT JOIN position_mstr ON (employee.pos_id = position_mstr.pos_id)";
$sql .= " LEFT JOIN department_mstr ON (employee.dept_id = department_mstr.dept_id)";
$result = mysql_query($sql);
while ($data = mysql_fetch_array($result)) {

echo $data['eid']. ":". $data['name']. ":". $data['pos_name']. ":". $data['dept_name']. ":". $data['salary']. "<br>";

}

?>

ผลที่ได้ก็จะเหมือนกันครับ...

มี LEFT JOIN ก็มี RIGHT JOIN เช่นกัน แต่จากคู่มือของ MySQL ระบุเอาไว้ว่า เพื่อความเข้ากันได้ของคำสั่ง SQL ในกรณีที่มีการเปลี่ยนไปใช้ฐานข้อมูลแบบอื่น (ที่ไม่ใช่ MySQL) ควรใช้ LEFT JOIN แทนครับ ดังนั้นผมจึงไม่ขอพูดถึง RIGHT JOIN

และจะว่าไปนั้น จริงๆ แล้วผมอยากจะพูดถึงวิธีสุดท้ายมากกว่าครับ... แต่ผมจะเอาไว้กล่าวถึงในตอนหน้า ส่วนตอนนี้ขาลาเพียงเท่านี่ก่อนครับ :)

อ้อ ก่อนจากก็อยากบอกก่อนว่า เรื่องของคำสั่ง LEFT JOIN นั้น จริงๆ แล้วมันมีอะไรที่ลึกซึ้งซับซ้อนซ่อนเงื่อนเพื่อนทรยศมากกว่าที่ผมนำมากล่าวถึงนะครับ แต่ผมจะไม่ขอพูดถึงลงไปในเชิงลึก เนื่องจากอย่างที่ผมได้บอกแล้วว่าผมเองก็ไม่ได้เป็นผู้เชี่ยวชาญด้านคำสั่ง SQL (เท่าที่สอนๆ ได้อยู่นี่ ก็ต้องอาศัยศึกษา และมั่วลองผิดลองถูกมาพอสมควรแล้ว)

ใครที่สนใจจะศึกษาเชิงลึก เกี่ยวกับเรื่องของคุณสมบัติตระกูล JOIN ของ SQL สำหรับ MySQL แนะนำให้ไปอ่าน documentation จากเว็บได้ตามลิงก์เลยครับ http://dev.mysql.com/doc/mysql/en/JOIN.html

(ติดตามตอนต่อไป)

<- Back | Next ->

ThaiMisc.Com : Free Webboard | Free GuestBook | Free Poll | Free Ecard Server | Free Java Chat Room | Advertising | Contact Us
Copyright 1999-2006 Thailand Miscellaneous. Allrights reserved. webmaster@thaimisc.com