ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

ThaiSEOBoard.comพัฒนาเว็บไซต์Programmingถามเรื่องคำสั่ง SQL กับการหา node สุดท้ายของกลุ่ม
หน้า: [1]   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: ถามเรื่องคำสั่ง SQL กับการหา node สุดท้ายของกลุ่ม  (อ่าน 2037 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
rtee
Newbie
*

พลังน้ำใจ: 10
ออฟไลน์ ออฟไลน์

กระทู้: 89



ดูรายละเอียด
« เมื่อ: 20 กันยายน 2012, 12:45:00 »

คือ ต้องอธิบายความต้องการให้ฟังก่อนนะครับ

- ตารางจะออกแบบเป็นเรื่องของ location โดยจะแบ่งจากระดับใหญ่ไปหาเล็ก เช่น ภาค > จังหวัด > อำเภอ(เขต) > ตำบล(แขวง)

ทีนี้ เรื่องโครงสร้างฐานข้อมูลจะออกมาลักษณะประมาณนี้


ตาราง location
- id = primary key
- parent = parent key of location (default=0 >> first node)
- subject = name of location (e.g. Bangkok)


ตัวอย่างข้อมูล >> [ID], [PARENT], [SUBJECT]
- 1, 0, Central
- 2, 1, Bangkok
- 3, 2, Wattana
- 4, 3, Klongton


คำถามคือ
สมมติว่าเราได้รับชุด array ค่า id มา เช่น $array = array(1,2,3,4);
เราจะมีวิธีการเขียน SQL Query ให้หาว่า ID อะไรเป็น last child node สุดท้ายภายใน query เดียวได้หรือไม่ครับ ?
หรือมีวิธีการหา last child node ได้อย่างไรบ้างครับ ? ผมคิดวกไปวนมาหลายรอบแล้ว นึกไม่ออกเลย..

บันทึกการเข้า
kobkung
Verified Seller
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 103
ออฟไลน์ ออฟไลน์

กระทู้: 1,308



ดูรายละเอียด เว็บไซต์
« ตอบ #1 เมื่อ: 20 กันยายน 2012, 16:30:14 »

query ยังนึกไม่ออก มีเวลานึกแค่สองนาที  wanwan019
ง่ายๆ คือ foreach ออกมา แล้วไล่ลำดับ array ไป array 0 คือภาค array 3 คือ แขวง ไรแบบนี้
บันทึกการเข้า

เราเป็นบริษัท รับทำเว็บไซต์ แก้เว็บเดิม เขียน Php+Mysql+jQuery+css+bootstrap  งานตามสั่ง ประสบการณ์ จะ 19 ปี ละจ้า
Smilephp.com รับทำเว็บไซต์บริษัท e-commerce + ระบบชำระเงิน paypal,ธนาคาร  เว็บบริษัท เว็บขายของ ระบบจอง เช่า เขียน PHP ได้ทุกแนว  ช่วงนี้เน้นรับงาน ERP ระบบเอกสารบริษัท ,บัญชี ,  Barcode, Stock , Warehouse , Logistic ติดต่อ 086-364-5262

งดตอบคนทำเว็บนอกลู่นอกทาง ไม่ทำเว็บ WP ปั่นแชร์ เว็บประมูล สคริปปั่นใดๆ ไม่ทำเว็บบอลและพ
tdelphi
Global Moderator
หัวหน้าแก๊งเสียว
*****

พลังน้ำใจ: 308
ออฟไลน์ ออฟไลน์

กระทู้: 1,599



ดูรายละเอียด เว็บไซต์
« ตอบ #2 เมื่อ: 20 กันยายน 2012, 16:32:28 »

select * from table order by id desc limit 1  ได้ไหม

หรือผมอ่านโจทย์ผิดหว่า
บันทึกการเข้า

kobkung
Verified Seller
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 103
ออฟไลน์ ออฟไลน์

กระทู้: 1,308



ดูรายละเอียด เว็บไซต์
« ตอบ #3 เมื่อ: 20 กันยายน 2012, 16:36:35 »

select * from table order by id desc limit 1  ได้ไหม

หรือผมอ่านโจทย์ผิดหว่า

เออนั่นสิ หรือผมอ่านผิดเนี่ย
บันทึกการเข้า

เราเป็นบริษัท รับทำเว็บไซต์ แก้เว็บเดิม เขียน Php+Mysql+jQuery+css+bootstrap  งานตามสั่ง ประสบการณ์ จะ 19 ปี ละจ้า
Smilephp.com รับทำเว็บไซต์บริษัท e-commerce + ระบบชำระเงิน paypal,ธนาคาร  เว็บบริษัท เว็บขายของ ระบบจอง เช่า เขียน PHP ได้ทุกแนว  ช่วงนี้เน้นรับงาน ERP ระบบเอกสารบริษัท ,บัญชี ,  Barcode, Stock , Warehouse , Logistic ติดต่อ 086-364-5262

งดตอบคนทำเว็บนอกลู่นอกทาง ไม่ทำเว็บ WP ปั่นแชร์ เว็บประมูล สคริปปั่นใดๆ ไม่ทำเว็บบอลและพ
rtee
Newbie
*

พลังน้ำใจ: 10
ออฟไลน์ ออฟไลน์

กระทู้: 89



ดูรายละเอียด
« ตอบ #4 เมื่อ: 21 กันยายน 2012, 12:26:08 »

select * from table order by id desc limit 1  ได้ไหม
หรือผมอ่านโจทย์ผิดหว่า
เออนั่นสิ หรือผมอ่านผิดเนี่ย

อืม... แต่ว่าความเป็นจริง ID อาจจะไม่ได้เรียงจาก น้อยไปมาก แบบตัวอย่างที่ให้มานะครับ เพราะบางครั้ง ID ที่มากกว่า อาจจะเป็น parent ของ ID ที่น้อยกว่าก็เป็นได้ (มีโอกาส)
บันทึกการเข้า
aekarach
ก๊วนเสียว
*

พลังน้ำใจ: 20
ออฟไลน์ ออฟไลน์

กระทู้: 404



ดูรายละเอียด เว็บไซต์
« ตอบ #5 เมื่อ: 21 กันยายน 2012, 13:32:23 »

Statement เดียวเขียนไม่ออกหรอกครับหรือต่อให้ออก Query ของท่านก็จะกินทรัพยากรระบบ แต่ถ้าอยากทำจริงๆ ต้องเปลี่ยน logic ในการวางโครงสร้างใน Table

เพิ่ม Field ในการเก็บรหัสกลุ่มที่เกี่ยวข้องกัน เช่น
โค๊ด:
01
0101

010101
01010101
01010102
01010102
01010104
.
.
.
010102
010103
.
.
.
0102
010201
010202
010203
010204
.
.
.
0103

ส่วน Meaning ท่านก็กำหนดเองว่าควรจะเป็นอะไร เช่นสองตัวแรกเป็นภาค สองตัวถัดเป็นจังหวัด
ถ้าทำแบบนี้แล้วจะเขียน SQL Statement เดียวได้แน่นอน ที่สำคัญสามารถระบุความลึก(level)ได้ไม่จำกัด
บันทึกการเข้า

ball6847
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 212
ออฟไลน์ ออฟไลน์

กระทู้: 4,152



ดูรายละเอียด
« ตอบ #6 เมื่อ: 21 กันยายน 2012, 13:37:02 »

ผมใช้ 2 query อ่ะ - -*

โค๊ด:

SELECT id FROM location
WHERE parent = (
    SELECT MAX(parent) FROM location WHERE id IN ( 1, 2, 3, 4 )
)

บันทึกการเข้า

kobkung
Verified Seller
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 103
ออฟไลน์ ออฟไลน์

กระทู้: 1,308



ดูรายละเอียด เว็บไซต์
« ตอบ #7 เมื่อ: 21 กันยายน 2012, 16:21:15 »

วันนี้ว่างละ จริงๆ หลีกเลี่ยงได้ควรหลบการทำ 2 statement ขึ้นไป แนะนำให้ปรับ base เหมือนกัน
สำหรับผมแล้ว database พวก online ทำหน้าที่แค่เก็บข้อมูล อย่าไปให้มันทำไรเยอะ เดี๋ยวยาว
บันทึกการเข้า

เราเป็นบริษัท รับทำเว็บไซต์ แก้เว็บเดิม เขียน Php+Mysql+jQuery+css+bootstrap  งานตามสั่ง ประสบการณ์ จะ 19 ปี ละจ้า
Smilephp.com รับทำเว็บไซต์บริษัท e-commerce + ระบบชำระเงิน paypal,ธนาคาร  เว็บบริษัท เว็บขายของ ระบบจอง เช่า เขียน PHP ได้ทุกแนว  ช่วงนี้เน้นรับงาน ERP ระบบเอกสารบริษัท ,บัญชี ,  Barcode, Stock , Warehouse , Logistic ติดต่อ 086-364-5262

งดตอบคนทำเว็บนอกลู่นอกทาง ไม่ทำเว็บ WP ปั่นแชร์ เว็บประมูล สคริปปั่นใดๆ ไม่ทำเว็บบอลและพ
ohmohm
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 170
ออฟไลน์ ออฟไลน์

กระทู้: 3,092



ดูรายละเอียด เว็บไซต์
« ตอบ #8 เมื่อ: 25 กันยายน 2012, 19:02:51 »

เป็นการเดินไปตามต้นไม้ใช่ไหมครับ ผมเคยเจอคล้ายๆ กัน แต่เป็นเมนูและเมนูย่อย
อาจต้องเป็น fetch ทำ loop หรือ recursive function แต่คงต้องทำให้ stored procedure ถ้าใช้ MySQL ผมไม่แน่ใจจะทำได้หรือเปล่า

แต่ถ้าหาแค่ last child node (หรือ leaf node) ซึ่งตัวมันเองจะเจอในตารางที่คอลัมน์ id แต่ไม่มี node ไหนมาชี้ คือไม่เจอที่คอลัมน์ parent เลย

น่าจะประมาณนี้
$csvstring = implode(", ", $array);
$sql = 'select * from location where id in ('. $csvstring .') and parent not in (' . $csvstring .')';
« แก้ไขครั้งสุดท้าย: 25 กันยายน 2012, 19:03:18 โดย ohmohm » บันทึกการเข้า
ปีศาจจำเป็น
Newbie
*

พลังน้ำใจ: 31
ออฟไลน์ ออฟไลน์

กระทู้: 50



ดูรายละเอียด
« ตอบ #9 เมื่อ: 25 กันยายน 2012, 19:19:05 »

ผมเคยเจอเคสแนวๆ นี้ครับ สุดท้ายจบที่การอ่าน id จาก AUTO_INCREMENT

โค๊ด:
SHOW TABLE STATUS LIKE table

ไม่แน่ใจว่าตรงคำถามหรือเปล่า
บันทึกการเข้า

คนบางคนเกิดมามีพร้อมทุกสิ่ง   ..แต่คนบางคนกลับลืมตาขึ้นมาเพื่อจะถามตัวเองว่า พรุ่งนี้จะมีชีวิตอยู่อย่างไร     [[ไล่ตงจิ้น]]

[มูลนิธิ กระจกเงา] http://www.mirror.or.th
[ศูนย์บริจาคออนไลน์] http://www.thaigiving.org
[ศูนย์รับบริจาคอวัยวะ สภากาชาดไทย] http://www.organdonate.in.th
หน้า: [1]   ขึ้นบน
พิมพ์