การจัดเก็บข้อมูลลงฐานข้อมูล SQL แบบ one-to-many และ เทคนิคการ Query ข้อมูล
ยกตัวอย่างในบทความนี้คือ ตารางสมาชิก (ตารางด้านซ้าย) และ ตารางสัตว์เลี้ยงของสมาชิก (ตารางด้านขวา) ที่สมาชิกแต่ละคนสามารถมีสัตว์เลี้ยงได้มากกว่า 1 ชนิด ซึ่งข้อมูลที่มีความสัมพันธ์กันคือ id ของตารางสมาชิก เชื่อมกับ user_id ของตารางสัตว์เลี้ยง
SELECT U.`id`,U.`name`,A.`animal`
FROM `tbl_user` AS U
INNER JOIN `tbl_animal` AS A ON A.user_id =U.`id`
ได้ผลลัพท์ตามตารางด้านล่าง
SELECT U.`id`,U.`name`,GROUP_CONCAT(A.`animal`) AS `animal`
FROM `tbl_user` AS U
INNER JOIN `tbl_animal` AS A ON A.user_id =U.`id`
GROUP BY U.`id`
ผลลัพท์ ก็จะเป็นดังตารางด้านล่าง ซึ่งตารางนี้จะเป็นรูปแบบข้อมูลที่มักจะถูก query บ่อยที่สุด
SELECT U.`id`,U.`name`,A.`animal`
FROM `tbl_user` AS U
INNER JOIN `tbl_animal` AS A ON A.user_id =U.`id`
WHERE A.`animal`='dog'
SELECT U.`id`,U.`name`,COUNT(A.`animal`) AS `animal`
FROM `tbl_user` AS U
INNER JOIN `tbl_animal` AS A ON A.user_id =U.`id`
GROUP BY U.`id`
การสอบถามว่ามีใครบ้างที่มีสัตว์เลี้ยงเป็น dog บ้าง
SELECT U.`id`,U.`name`,'dog' AS `animal`
FROM `tbl_user` AS U
WHERE U.`animal` LIKE '%,dog,%'
- '%,dog,%' เป็นข้อมูลที่ใช้ในการสอบถาม ตัวคั่น , ที่เพิ่มเข้าไป ใช้เพื่อให้การสอบถามได้ข้อมูลที่ตรงตามเงื่อนไขออกมา ยกตัวอย่างเช่น dog และ dogger ถ้าค้นหาเพียงคำว่า dog ก็จะได้ข้อมูลทั้งสองรายการออกมา แต่ถ้าเราใช้ ,dog, ในการค้นหา เราก็จะได้เพียงรายการ dog ออกมาเท่านั้น
- 'dog' AS `animal` คำสั่งนี้เป็นแค่การคืนค่าข้อมูลที่ใช้ในการค้นหาออกมาเท่านั้น
ส่วนการนับจำนวนสัตว์เลี้ยงของแต่ละคน จะอาศัยการ Query ข้อมูลออกมาตามปกติ และอาศัยการนับจำนวนข้อมูลด้วย PHP แทน
// ตัวแปรแอเรย์เก็บผลลัพท์การ Query ที่แปลงข้อมูลแล้ว
$result = array();
// ประมวลผลคำสั่ง SQL (คำสั่งสมมุติ หากใช้งานจริงให้ใช้คำสั่งของ Framework หรือ PHP ที่ใช้ในการเชื่อมต่อฐานข้อมูล)
$db_conn->query('SELECT * FROM `tbl_user`);
foreach($db_conn->exexute() as $item) {
// ตัดตัวคั่น , ด้านหน้า หลังออก
$animal = trim($item->animal, ',');
// แยก animal ออกเป็น Array (สามารถนำไปใช้ประโยชน์อื่นได้ เช่นการสรุปข้อมูลตามตารางที่ 2)
$animals = explode(',', $animal);
// คืนค่าผลลัพท์ที่ต้องการ
$result[] = array(
'id' => $item->id,
'name' => $item->name,
// นับจำนวน animal จากจำนวนข้อมูลในแอเรย์
'animal' => sizeof($animals);
}
ผลลัพท์ที่ $result ก็จะได้ตามตารางที่ 6