ตย. การ join ตาราง 2 ตาราง โดยใช้ INNER JOIN เพื่อเทียบข้อมูลที่ตรงกันระหว่าง 2 ตาราง “SQL: php+mysqli INNER JOIN 2 TABLE“
รวมคลิปสอน php+mysqli
สอน CodeIgniter สอนทำระบบหนังสือเวียนออนไลน์
สอน CodeIgniter สอนทำระบบยืมคืนครุภัณฑ์
*คอร์สออนไลน์ราคาถูกของ devbanban.com คลิก
ตย. ใน workshop นี้จะใช้ 2 ตาราง คือ tb_member สำหรับเก็บข้อมูลสมาชิก/บุคลากร และ tb_position สำหรับเก็บข้อมูลตำแหน่ง โดย 2 ตารางจะมีฟิลด์ที่มีความสัมพันธ์กันอยู่คือ po_id และ ref_po_id ดังภาพ
SQL ที่ใช้
1 2 3 4 |
SELECT m.*,p.po_name FROM tb_member as m INNER JOIN tb_position as p ON p.po_id = m.ref_po_id ORDER BY p.po_id asc |
tb_member
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
CREATE TABLE `tb_member` ( `member_id` int(11) NOT NULL, `ref_po_id` int(11) NOT NULL COMMENT 'รหัสตำแหน่ง', `member_name` varchar(100) NOT NULL, `member_lname` varchar(100) NOT NULL, `email` varchar(100) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Dumping data for table `tb_member` -- INSERT INTO `tb_member` (`member_id`, `ref_po_id`, `member_name`, `member_lname`, `email`) VALUES (1, 1, 'Super ', 'Admin', 'devbanban@gmail.com'), (2, 2, 'Super', 'Manager', 'devbanban@gmail.com'), (3, 3, 'devbanban', 'dotcom', 'devbanban@gmail.com'), (4, 3, 'web', 'developer', 'devbanban@gmail.com'); -- -- Indexes for dumped tables -- -- -- Indexes for table `tb_member` -- ALTER TABLE `tb_member` ADD PRIMARY KEY (`member_id`), ADD KEY `ref_po_id` (`ref_po_id`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `tb_member` -- ALTER TABLE `tb_member` MODIFY `member_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5; -- -- Constraints for dumped tables -- -- -- Constraints for table `tb_member` -- ALTER TABLE `tb_member` ADD CONSTRAINT `tb_member_ibfk_1` FOREIGN KEY (`ref_po_id`) REFERENCES `tb_position` (`po_id`); COMMIT; |
tb_position
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
CREATE TABLE `tb_position` ( `po_id` int(11) NOT NULL, `po_name` varchar(100) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Dumping data for table `tb_position` -- INSERT INTO `tb_position` (`po_id`, `po_name`) VALUES (1, 'ADMINISTRATOR'), (2, 'MANAGER'), (3, 'PROGRAMMER'); -- -- Indexes for dumped tables -- -- -- Indexes for table `tb_position` -- ALTER TABLE `tb_position` ADD PRIMARY KEY (`po_id`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `tb_position` -- ALTER TABLE `tb_position` MODIFY `po_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; COMMIT; |
php file
condb.php สำหรับเชื่อมต่อฐานข้อมูล
1 2 3 4 |
<?php $con= mysqli_connect("localhost","root","password","myweb") or die("Error: " . mysqli_error($con)); mysqli_query($con, "SET NAMES 'utf8' "); ?> |
Full code devbanban.com
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
<meta charset="UTF-8"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <?php //1. เชื่อมต่อ database: include('condb.php'); //ไฟล์เชื่อมต่อกับ database ที่เราได้สร้างไว้ก่อนหน้าน้ี //2. query ข้อมูลจากตาราง tb_member: $query = "SELECT * FROM tb_member ORDER BY member_id asc" or die("Error:" . mysqli_error()); //3.เก็บข้อมูลที่ query ออกมาไว้ในตัวแปร result . $result = mysqli_query($con, $query); //4 . แสดงข้อมูลที่ query ออกมา โดยใช้ตารางในการจัดข้อมูล: echo "<div class='container'>"; echo "<div class='row'>"; echo "<div class='col-md-6'>"; echo '<h4 align="center"> TABLE MEMBER </h4>'; echo "<table border='1' align='center' class='table table-hover'>"; echo " <tr align='center' bgcolor='#CCCCCC'> <td>รหัส</td> <td>ชื่อ</td> <td>นามสกุล</td> <td>อีเมล์</td> <td>รหัสตำแหน่ง</td> </tr>"; foreach( $result as $value ) { echo "<tr>"; echo "<td>" .$value["member_id"] . "</td> "; echo "<td>" .$value["member_name"] . "</td> "; echo "<td>" .$value["member_lname"] . "</td> "; echo "<td>" .$value["email"] . "</td> "; echo "<td>" .$value["ref_po_id"] . "</td> "; echo "</tr>"; } echo "</table>"; //5. close connection echo '<hr>'; echo '</div>'; $query2 = "SELECT * FROM tb_position ORDER BY po_id asc" or die("Error:" . mysqli_error()); $result2 = mysqli_query($con, $query2); echo "<div class='col-md-3'>"; echo '<h4 align="center"> TABLE POSITION </h4>'; echo "<table border='1' align='center' class='table table-hover'>"; echo " <tr align='center' bgcolor='#CCCCCC'> <td>รหัส</td> <td>ชื่อ</td> </tr>"; foreach( $result2 as $values ) { echo "<tr>"; echo "<td>" .$values["po_id"] . "</td> "; echo "<td>" .$values["po_name"] . "</td> "; echo "</tr>"; } echo "</table>"; //5. close connection echo '<hr>'; echo '</div>'; echo '</div>'; //row; $query3 = " SELECT m.*,p.po_name FROM tb_member as m INNER JOIN tb_position as p ON p.po_id = m.ref_po_id ORDER BY p.po_id asc" or die("Error:" . mysqli_error()); $result3 = mysqli_query($con, $query3); echo "<div class='row'>"; echo "<div class='col-md-6'>"; echo '<h4 align="center"> JOIN TABLE </h4>'; echo "<table border='1' align='center' class='table table-hover'>"; echo " <tr align='center' bgcolor='#CCCCCC'> <td>รหัส</td> <td>ชื่อ</td> <td>นามสกุล</td> <td>อีเมล์</td> <td>ตำแหน่ง</td> </tr>"; foreach( $result3 as $row ) { echo "<tr>"; echo "<td>" .$row["member_id"] . "</td> "; echo "<td>" .$row["member_name"] . "</td> "; echo "<td>" .$row["member_lname"] . "</td> "; echo "<td>" .$row["email"] . "</td> "; echo "<td class='danger'>" .$row["po_name"] . "</td> "; echo "</tr>"; } echo "</table>"; echo '</div>'; echo '</div>'; //md-6; echo '</div>'; //row; echo '</div>'; //container; ?> <?php mysqli_close($con); ?> |
Result
เพิ่มเติม กรณีต้องการเทียบตารางมากกว่า 2 ตารางขึ้นไปก็เขียน INNER JOIN เพิ่มเรื่อยๆ ครับ และต้องศึกษาการออกแบบฐานข้อมูลเพิ่มเยอะๆ นะคร้ับ
ตย.
1 2 3 4 5 |
SELECT m.*,p.po_name, d.field FROM tb_member as m INNER JOIN tb_position as p ON p.po_id = m.ref_po_id INNER JOIN tb_department as d ON d.d_id = m.ref_d_id ORDER BY p.po_id asc |
**ฝากอีกนิดนึงครับ ถ้าตารางมี 10 field แต่ต้องการแสดงข้อมูลแค่ 3 field ไม่ควรใช้ SELECT * FROM table ครับ เพราะจะเปลืองทรัพยากรเครื่องมากๆ ควร SELECT เฉพาะฟิลด์ที่จะใช้ครับ
จะมี workshop ตัวอย่างให้ศึกษาเรื่อยๆนะคร้ับ devbanban.com
รวมคลิปสอนทำเว็บไซต์
ตะกร้าสินค้า v1 v2 V3
V1 = 1500 บาท, V2=2,500 บาท, V3=3,500 บาท
ระบบยืม-คืน เบิก-จ่ายพัสดุอุปกรณ์สำนักงาน 5,000 บาท
ระบบแจ้งซ่อมออนไลน์ 1,000 บาท
ร่วมสนับสนุน ค่ากาแฟ ค่าโฮส devbanban.com และทีมงานได้ที่
ธนาคารกรุงไทย สาขาเดอะมอลล์ท่าพระ
ชื่อบัญชี นายพิศิษฐ์ บวรเลิศสุธี เลขที่ 878-0-17747-6
————————————————————————————
ธนาคารไทยพาณิชย์ สาขามหาวิทยาลัยราชภัฏธนบุรี
ชื่อบัญชี นายพิศิษฐ์ บวรเลิศสุธี เลขที่ 406-359094-1
fanpage : https://www.facebook.com/sornwebsites/