ถามเรื่องคำสั่ง SQL กับการหา node สุดท้ายของกลุ่ม

เริ่มโดย rtee, 20 กันยายน 2012, 12:45:00

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

rtee

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

- ตารางจะออกแบบเป็นเรื่องของ 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

query ยังนึกไม่ออก มีเวลานึกแค่สองนาที  :wanwan019:
ง่ายๆ คือ foreach ออกมา แล้วไล่ลำดับ array ไป array 0 คือภาค array 3 คือ แขวง ไรแบบนี้
เราเป็นบริษัท รับทำเว็บไซต์ แก้เว็บเดิม เขียน Php+Mysql+jQuery+css+bootstrap  งานตามสั่ง ประสบการณ์ จะ 19 ปี ละจ้า
[direct=http://www.smilephp.com]Smilephp.com[/direct] รับทำเว็บไซต์บริษัท e-commerce + ระบบชำระเงิน paypal,ธนาคาร  เว็บบริษัท เว็บขายของ ระบบจอง เช่า เขียน PHP ได้ทุกแนว  ช่วงนี้เน้นรับงาน ERP ระบบเอกสารบริษัท ,บัญชี ,  Barcode, Stock , Warehouse , Logistic ติดต่อ 086-364-5262
[direct=http://www.sellerorder.com ระบบหลังบ้าน จัดการ Order ขายของ  ช่วงนี้หาคนทดสอบฟรี ขอได้ตามเมลในเว็บ[/direct]
งดตอบคนทำเว็บนอกลู่นอกทาง ไม่ทำเว็บ WP ปั่นแชร์ เว็บประมูล สคริปปั่นใดๆ ไม่ทำเว็บบอลและพ

tdelphi

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

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

kobkung

อ้างถึงจาก: tdelphi ใน 20 กันยายน 2012, 16:32:28
select * from table order by id desc limit 1  ได้ไหม

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

เออนั่นสิ หรือผมอ่านผิดเนี่ย
เราเป็นบริษัท รับทำเว็บไซต์ แก้เว็บเดิม เขียน Php+Mysql+jQuery+css+bootstrap  งานตามสั่ง ประสบการณ์ จะ 19 ปี ละจ้า
[direct=http://www.smilephp.com]Smilephp.com[/direct] รับทำเว็บไซต์บริษัท e-commerce + ระบบชำระเงิน paypal,ธนาคาร  เว็บบริษัท เว็บขายของ ระบบจอง เช่า เขียน PHP ได้ทุกแนว  ช่วงนี้เน้นรับงาน ERP ระบบเอกสารบริษัท ,บัญชี ,  Barcode, Stock , Warehouse , Logistic ติดต่อ 086-364-5262
[direct=http://www.sellerorder.com ระบบหลังบ้าน จัดการ Order ขายของ  ช่วงนี้หาคนทดสอบฟรี ขอได้ตามเมลในเว็บ[/direct]
งดตอบคนทำเว็บนอกลู่นอกทาง ไม่ทำเว็บ WP ปั่นแชร์ เว็บประมูล สคริปปั่นใดๆ ไม่ทำเว็บบอลและพ

rtee

อ้างถึงจาก: kobkung ใน 20 กันยายน 2012, 16:36:35
อ้างถึงจาก: tdelphi ใน 20 กันยายน 2012, 16:32:28
select * from table order by id desc limit 1  ได้ไหม
หรือผมอ่านโจทย์ผิดหว่า
เออนั่นสิ หรือผมอ่านผิดเนี่ย

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

aekarach

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

เพิ่ม Field ในการเก็บรหัสกลุ่มที่เกี่ยวข้องกัน เช่น

01
0101

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


ส่วน Meaning ท่านก็กำหนดเองว่าควรจะเป็นอะไร เช่นสองตัวแรกเป็นภาค สองตัวถัดเป็นจังหวัด
ถ้าทำแบบนี้แล้วจะเขียน SQL Statement เดียวได้แน่นอน ที่สำคัญสามารถระบุความลึก(level)ได้ไม่จำกัด
[direct=http://www.datasite.co.th/domain.php] Domain .com .net 450 บาท[/direct][direct=http://www.datasite.co.th/hosting.php] Hosting 100MB 1,200 บาท/ปี สำรองข้อมูล 365 วัน[/direct]
[direct=http://www.datasite.co.th/vps.php] Window VPS/ Linux VPS เดือนละ 1,500 บาท [/direct]
[direct=http://www.datasite.co.th/colocation.php] ฝากเซิร์ฟเวอร์ทรูเมืองทองธานี เดือนละ 3,500 บาท มี KVM on the NET [/direct]
บริษัท ดาต้าไซต์ จำกัด โทร 02-686-1226 (จ-ศ 8.30-17.30)สายด่วน 081-423-2838 ตลอด 24 ชั่วโมง

ball6847

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



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

We use Ubuntu.

[direct=http://ng-seo.sourcelab.xyz/]AngularJS SEO Experimental[/direct]

kobkung

วันนี้ว่างละ จริงๆ หลีกเลี่ยงได้ควรหลบการทำ 2 statement ขึ้นไป แนะนำให้ปรับ base เหมือนกัน
สำหรับผมแล้ว database พวก online ทำหน้าที่แค่เก็บข้อมูล อย่าไปให้มันทำไรเยอะ เดี๋ยวยาว
เราเป็นบริษัท รับทำเว็บไซต์ แก้เว็บเดิม เขียน Php+Mysql+jQuery+css+bootstrap  งานตามสั่ง ประสบการณ์ จะ 19 ปี ละจ้า
[direct=http://www.smilephp.com]Smilephp.com[/direct] รับทำเว็บไซต์บริษัท e-commerce + ระบบชำระเงิน paypal,ธนาคาร  เว็บบริษัท เว็บขายของ ระบบจอง เช่า เขียน PHP ได้ทุกแนว  ช่วงนี้เน้นรับงาน ERP ระบบเอกสารบริษัท ,บัญชี ,  Barcode, Stock , Warehouse , Logistic ติดต่อ 086-364-5262
[direct=http://www.sellerorder.com ระบบหลังบ้าน จัดการ Order ขายของ  ช่วงนี้หาคนทดสอบฟรี ขอได้ตามเมลในเว็บ[/direct]
งดตอบคนทำเว็บนอกลู่นอกทาง ไม่ทำเว็บ WP ปั่นแชร์ เว็บประมูล สคริปปั่นใดๆ ไม่ทำเว็บบอลและพ

ohmohm

เป็นการเดินไปตามต้นไม้ใช่ไหมครับ ผมเคยเจอคล้ายๆ กัน แต่เป็นเมนูและเมนูย่อย
อาจต้องเป็น 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 .')';

ปีศาจจำเป็น

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

SHOW TABLE STATUS LIKE table

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

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