Thaimisc.com : PHP กับฐานข้อมูล MySQL (25)
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 (25)
เขียนโดย เดอะกาฝากไดอารี่ (ball@bbznet.com) , 27-07-2004
การสืบค้นข้อมูลจากหลายตารางเป็นสิ่งที่มีประโยชน์ และจริงๆ แล้ว ออกจะเรียกว่าจำเป็นมากด้วยนะครับ... ยังไงก็ศึกษาเอาไว้ดีกว่านะครับ

ตอนที่ผมเขียนโปรแกรม Diary Management System (โปรแกรมไดอารี่ออนไลน์) เวอร์ชัน 1 และ 2 นั้นผมยังไม่ได้ศึกษาถึงเรื่องการสืบค้น (query) ข้อมูลจากหลายๆ ตาราง ดังนั้นโค้ด PHP ที่ผมเขียนขึ้นเพื่อใช้สืบค้นข้อมูล เลยค่อนข้างจะยืดเยื้อครับ กล่าวคือผมจะต้องทำการสืบค้นข้อมูลจากตารางหลักขึ้นมาก่อน จากนั้นผมก็จะเอาข้อมูลบางฟิลด์ของตารางนั้น ไปทำการสืบค้นข้อมูลเพิ่มเติมมาจากตารางอื่นต่อ

ผมจะลองยกตัวอย่างให้ดูนะครับ... อย่างในกรณีของตาราง employee ของเรา หากสืบค้นแบบปกติรอบแรก คือ

<?php

//เอ๊ะ ไม่ทราบว่ายังจำฟังก์ชัน PHP ที่ใช้เชื่อมต่อฐานข้อมูล MySQL กันได้หรือเปล่าเอ่ย :p
$conn = mysql_connect("localhost", "root", ""); //เชื่อมต่อกับฐานข้อมูล
mysql_select_db("company"); //เลือกใช้ฐานข้อมูลชื่อ company
$sql = "SELECT * FROM employee";
$result = mysql_query($sql);
while ($data = mysql_fetch_array($result)) {

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

}

เราจะได้ข้อมูลออกมาเพียง

ซึ่งยังไม่สมบูรณ์เนื่องจากเราไม่สามารถบอกได้ว่า ไอ้ฟิลด์ pos_id มีค่าเป็น 1 นั้นมันหมายถึงตำแหน่งอะไร หรือ dept_id มีค่าเท่ากับ 4 หมายถึงแผนกไหนใช่ไหมครับ... ดังนั้นหากต้องการให้แสดงค่าเป็นชื่อแผนก หรือชื่อตำแหน่งออกมาเลย เราต้องทำการสืบค้นจากตารางอีก 2 ตาราง คือ position_mstr และ department_mstr ซึ่งหากเราใช้วิธี สืบค้นทีละตาราง เราจะได้โค้ดยาวเหยียด และดูสับสนแบบนี้ครับ

<?php

//เอาโค้ดแรกมาปรับปรุงเพิ่มอีกนิด
$conn = mysql_connect("localhost", "root", ""); //เชื่อมต่อกับฐานข้อมูล
mysql_select_db("company"); //เลือกใช้ฐานข้อมูลชื่อ company
$sql = "SELECT * FROM employee";
$result = mysql_query($sql);
while ($data = mysql_fetch_array($result)) {

$sql2 = "SELECT * FROM position_mstr WHERE pos_id = '". $data['pos_id']. "' LIMIT 0,1";
$result2 = mysql_query($sql2);
$data2 = mysql_fetch_array($result2);

$sql3 = "SELECT * FROM department_mstr WHERE dept_id = '". $data['dept_id']. "' LIMIT 0,1";
$result3 = mysql_query($sql3);
$data3 = mysql_fetch_array($result3);

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

}

คราวนี้ พอรันโค้ดแล้วเราจะได้แบบนี้ครับ

แบบนี้ค่อยอ่านรู้เรื่องหน่อยจริงไหมล่ะครับ?!? ดังนั้นจะว่าไปแล้ว วิธีการนี้หากทำได้ ก็ไม่จำเป็นต้องไปทำการสืบค้นข้อมูลจากหลายตารางหรอกเนอะ... หึหึหึ เฮ้ย! ไม่ได้ๆ นี่ขนาดแค่มีอ้างอิงตารางอื่นแค่ 2 ตารางเอง มันยังวุ่นวายขนาดนี้ แล้วถ้าเกิดมันอ้างอิงตารางอื่นเป็นสิบๆ ตารางล่ะ จะว่าไง?!? คำตอบคือ ไอ้คนออกแบบฐานข้อมูลมันคงบ้าละครับ ใครจะอ้างอิงตารางอื่นเป็นสิบ ภายในตารางเดียว?!?

อ้าว ชักนอกเรื่อง... เหอๆ.... เอาเหอะครับ จะอ้างอิง 2 หรือ 10 ตารางก็ตามแต่ การเขียนโค้ดดิบๆ แบบแรกนั้นมันมีข้อเสียจริงๆ ครับ ในฐานะที่ผมเคยทำแบบนี้มาก่อน เหอๆ ซึ่งผมจะขอบอกข้อเสียเป็นข้อๆ ดังนี้

1) ต้องวนรอบในการสืบค้นหลายรอบ มันสิ้นเปลืองเวลาในการประมวลผล... โดยส่วนแล้วผมมองว่า การสืบค้นทีเดียวโดยมองจากหลายๆ ตาราง มันย่อมเร็วกว่าการสืบค้นจากตารางแรก แล้วไปดูว่ามันอ้างอิงไปที่ไหน จากนั้นไปสืบค้นต่อ แล้วก็ดูต่อไปเรื่อยๆ จริงไหมล่ะครับ?!?

2) สิ้นเปลืองหน่วยความจำ ที่ต้องมาใช้ในการเก็บค่าตัวแปรที่ใช้ในการ query อีกด้วย โดยเฉพาะไอ้ส่วนที่เกินมาเช่น $sql2, $sql3, $result2 กะ $result3

ว่าจะเขียนต่อ แต่พอดีน้องชายชวนไปเดินตรอกข้าวสารครับ ในฐานะที่ไม่เคยไปมาก่อน (เชยมะผม) ก็ต้องขอไปเปิดหูเปิดตาหน่อยละครับ งั้น เอาไว้เขียนต่อคราวหน้า จะให้ดูว่า พอเอามาเป็นการสืบค้นหลายตารางแล้ว โค้ดจะเหลือแค่ไหน... จากนั้นเราค่อยไปว่ากันต่อเรื่องการสืบค้นจากหลายตารางในวิธีอื่นๆ ที่เหลือครับ

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

<- 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