Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,027

HOME > PHP > PHP Forum > ขอถามเกี่ยวกับคำสั่ง sql ค่ะ ว่าจะใช้คำสั่งอย่างไรในการjoin ตารางเดียวกัน



 

ขอถามเกี่ยวกับคำสั่ง sql ค่ะ ว่าจะใช้คำสั่งอย่างไรในการjoin ตารางเดียวกัน

 



Topic : 079052



โพสกระทู้ ( 180 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook



พอดีต้องการ select ข้อมูลจาก record ที่มีค่าไกล้เคียงกับค่าที่มีอยู่มากที่สุดเพียง record จาก หลาย record

คือมีค่า x=??? เป็นตัวเลขอะไรก่อได้แล้วแต่ user input เข้ามา

จากนั้นให้นำ x ไปเปรียบเทียบกับข้อมูลใน table เพื่อเทียบว่าไกล้เคียงอันใหนมากที่สุด แล้วselect record นั้นออกมาจะใช้คำสั่ง sql อย่างไรดีคะ

ตัวอย่างนี้นะคะ

select * from point_log where min=(select min((gps_lon+gps_lat)-130.225) from point_log where d_post='2011-06-02')

แต่อันนี้มันrun ไม่ได้นะคะ มันผิดอ่ะคะ



Tag : PHP, MySQL







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2012-05-28 15:10:07 By : tai_kook View : 1940 Reply : 12
 

 

No. 1



โพสกระทู้ ( 314 )
บทความ ( 0 )



สถานะออฟไลน์


ขอดูตัวอย่างข้อมูลหน่อยครับ ถ้าเป็นไปได้ก็ Export โครงสร้าง กับข้อมูลตัวอย่าง แล้วก็ตัวอย่างของผลลัพธ์มาให้ดูหน่อยครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-05-28 15:29:12 By : Songkram
 


 

No. 2



โพสกระทู้ ( 180 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

มันเป็นระบบติดตามรถนะคะ จะมีการวาดภาพลง map ในพิกัดต่างๆที่รถวิ่งผ่าน จะเป็นเส้นทาง เราแสดงโดยการ select ข้อมูลมาวนลูปวาดเป็นเส้นทางค่ะ


แต่ที่ต้องการคือ เมื่อเราคลิกที่เส้นแล้วมีรายละเอียดออกมาว่าเราผ่านจุดนี้เวลาใหนอย่างไร

สิ่งที่เราส่งไปให้คือ lat lon ที่เราคลิก

จากนั้นจะเอาไปเที่ยบใน data base ว่าไกล้เคียงกับ lat lon ใหนมากที่สุด แ้ลว select เอา record นั้นออกมาค่ะ

แต่ปัญหาคือคือถ้าเราเอาไปเปียบเทียบกับทุก record ประมาณ 20000 record มันจะแสดงผลช้ามาก

เพราะกว่าจะหาระยะห่างของแต่ละ พิกีดที่มีอยู่ในฐานข้อมูลกับพิกัดที่เรากดลงไป 20000 record แล้วมาหาอันที่สั้นที่สุด

วิธีนี้ทำแล้วค่ะ คือ select ทั้งหมามาอัพเดท min ว่าห่างเท่าใหร่ ใช้เวลาประมาณสี่-ห้านาที

เลยต้องการใช้คำสั่ง sql เดียวในการselect ครั้งเดียวคือ select เอา record เดียวที่ไกล้เคียงที่สุดค่ะ

***ยาวมาก จะพอมีเวลาอ่านหรือเปล่าคะ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-05-28 15:41:53 By : tai_kook
 

 

No. 3



โพสกระทู้ ( 180 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

อันนี้ database นะคะ


มีหลายฟิลหน่อย

user จะส่ง loa lon มาให้เราแล้วเราเอามาเทียบกับ lat lon ในdatabase ของเราค่ะว่าไกล้อันใหนมาที่สุด แล้วเอา record นั้นออกไปแสดงผลค่ะ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-05-28 15:45:33 By : tai_kook
 


 

No. 4



โพสกระทู้ ( 180 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

อัันี้ข้อมูลที่ต้องการเอาออกไปแสดงผลนะคะ


เอา record ที่ไกล้เคียงที่สุดไปแสดงผล
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-05-28 15:52:26 By : tai_kook
 


 

No. 5



โพสกระทู้ ( 314 )
บทความ ( 0 )



สถานะออฟไลน์


กำลังหาวิธีนะครับ... รอหน่อย เกือบได้แล้ว แต่อาจจะไม่ได้ก็ได้... แหะๆ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-05-28 16:32:09 By : Songkram
 


 

No. 6



โพสกระทู้ ( 180 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ช่วยหนูหน่อยนะคะ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-05-28 17:21:36 By : tai_kook
 


 

No. 7



โพสกระทู้ ( 314 )
บทความ ( 0 )



สถานะออฟไลน์


ถ้าต้องการคำนวนระยะทางระหว่างจุดตัด ว่าจุดใดไกล้จุดที่กำหนดกว่ากัน ผมเลยไปค้นดูในเวป ก็มีหลายแบบอยู่นะครับ
ผมเลยเลือกมานำเสนอแบบหนึ่งก็ตามนี้เลยนะครับ (ผมลองแทนค่าจุดที่ต้องการค้นหาคือ lat=14.88967 และ lon=103.47436)

Code (PHP)
SELECT *,
(((acos(sin((14.88967*pi()/180)) * sin((`gps_lat`*pi()/180))+cos((14.88967*pi()/180)) * cos((`gps_lat`*pi()/180)) * cos(((103.47436 - `gps_lon`)*pi()/180))))*180/pi())*60*1.1515) as distance 
FROM `point_log`
ORDER BY distance ASC
LIMIT 1


สามารถทดสอบดูได้โดยการแทนค่า $lat กับ $lon ซึ่งสองตัวแปรนี้จะถูกกรอกเข้ามาโดยผู้ใช้อยู่แล้ว

ผมลองกรอกข้อมูลจุดที่อยู่กึ่งกลางระหว่างจุดที่มีใน record มันจะได้ระยะทางที่เท่ากันมากกว่า 1 รายการ แต่มันจะเลือกรายการที่เจอก่อนมาอยู่บนเสมอ เพราะฉะนั้นถ้าเรา LIMIT 1 ไว้ ก็อาจจะเป็นไปได้ว่ามีอีกจุดนึงที่อยู่ไกล้เท่ากับคำตอบก็ได้นะครับ ซึ่งตรงนี้ก็แล้วแต่ว่าจะจัดการแบบไหนในกรณีที่มีจุดมีระยะห่างเท่ากันมากกว่า 1 จุด

โดย SQL จะเป็นการคำนวนระยะทางของแต่ละรายการ โดยเปรียบเทียบกันกับจุดที่กำหนด แล้วจัดเรียงข้อมูลที่น้อยที่สุด (ความหมายคือไกล้สุด) เอาไว้ด้านบน โดยใช้ LIMIT 1 มาเป็นตัวบอกมันว่าเอารายการเดียวมาใช้ (ถ้าลองเอา LIMIT 1 ออกจะเห็นว่ามันคำนวนทั้งหมด)

เพราะฉะนั้น script PHP ก็น่าจะประมาณนี้ครับ (ระวังเรื่องช่องว่างและอักขระพิเศษด้วยนะครับ)

Code (PHP)
$lat = $_POST[lat];
$lon = $_POST[lon];

$sql = "SELECT *,
(((acos(sin(( ".$lat." * pi()/180)) * sin((`gps_lat`*pi()/180))+cos((".$lat." *pi()/180)) * cos((`gps_lat`*pi()/180)) * cos(((".$lon." - `gps_lon`)*pi()/180))))*180/pi())*60*1.1515) as distance 
FROM `point_log`
ORDER BY distance ASC
LIMIT 1"


ไม่ทราบว่าตรงกับความต้องการหรือเปล่านะครับ..... ...


ประวัติการแก้ไข
2012-05-29 08:32:41
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-05-28 21:12:13 By : Songkram
 


 

No. 8



โพสกระทู้ ( 314 )
บทความ ( 0 )



สถานะออฟไลน์


เนื่องจากการหาระยะทางต้องคำนวนมาจากสูตรทางคณิตศาสตร์นะครับ ไม่ใช่แค่เปรียบเทียบความไกล้เคียงของตัวเลขเท่านั้น...
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-05-29 08:35:26 By : Songkram
 


 

No. 9



โพสกระทู้ ( 180 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ขอบคุณมากนะคะ

ตอนนี้ทำได้แล้วค่ะ

แต่ติดปัญกาตรงที่ table point_log นั้นมีข้อมูล 8000000 record

มันใช้เวลาในการค้นหานานมากค่ะ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-05-29 10:36:25 By : tai_kook
 


 

No. 10



โพสกระทู้ ( 314 )
บทความ ( 0 )



สถานะออฟไลน์


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

แต่ในตารางที่คุณให้มานี้ จะมีกิจกรรมของ SQL ก็คือการค้นหาข้อมูล และเปรียบเทียบข้อมูล ถ้าเป็นการเปรียบเทียบตัวเลขธรรมดาจะไม่ช้าเลยครับ
แต่ที่ผมคิวรี่เป็นตัวอย่างไปนั้นมันจะมีการคำนวนด้วยสูตรด้วยมันจึงมีกิจกรรมเพิ่มเข้ามา ยังไงเรื่องการหาระยะทางก็ต้องใช้สูตรนี้อยู่ดี เพราะฉะนั้นหลีกเลี่ยงการใช้สูตรไม่ได้
ยิ่งถ้าคุณใช้คิวรี่ซ้อนกับคิวรี่ในตารางเดียวกันเองยิ่งช้าลงไปอีกครับตามหลักการ

สิ่งที่จะทำได้ต่อไปนี้คือ ...(ถ้าเป็นไปได้)
การปรับโครงสร้างของตารางใหม่ โดยการแยกข้อมูล gps_lat กับ gps_lon ออกมาเพื่อเก็บเป็นรายการทั้งหมด พร้อมทั้ง Optimize ตารางนี้ให้ดีที่สุด
แล้วก็สร้าง Index เพื่อเก็บข้อมูลการเข้าถึงรายการนตารางนี้ ปกติข้อมูลที่อยู่ในฐานข้อมูล มีเป็นแสนล้านรายการครับ ถ้าจัดการโครงสร้างให้เหมาะสม การคิวรี่จะมีประสิทธิภาพดีขึ้นครับ เพราะฉะนั้นเมื่อคิวรี่หาข้อมูลที่ต้องการได้แล้วจากตารางนี้ ค่อยนำไปค้นหาข้อมูลย่อยอื่นในตารางหลักอีกทีครับ

อย่างที่กล่าวไปแล้วนะครับ เรื่องการเก็บข้อมูลในปริมาณมากๆนั้น ยิ่งต้องคำนึงถึงโครงสร้างของฐานข้อมูล (Database structure) เป็นสำคัญ การทำ normalization ก็ต้องคำนึงถึงให้มากด้วย ถ้าได้ผ่านการคิดมาดีแล้ว ที่นี้ก็อยู่ที่ code ของเราล่ะครับ ที่จะต้องจัดการยังไง

บางครั้งการคิวรี่ในครั้งเดียวเลยอาจจะไม่ค่อยดีนัก ถึงมันจะสะดวก แต่อาจจะเป็นการดีกว่าถ้าเราคิวรี่เล็กๆหลายครั้ง เช่นในกรณีนี้ถ้าคิวรี่ครั้งเดียวมันทำให้ระบบมีปัญหา ก็อาจจะต้องแบงเป็นคิวรี่จากตารางที่แยกออกมาก่อน แล้วค่อยเอาผมลัพธ์ที่ได้ไปค้นหาข้อมูลจากตารางหลักอีกที ที่คิดว่าน่าจะดีกว่าก็เพราะเราสามารถเปรียบเทียบข้อมูลจาก Index ที่สร้างขึ้นได้เลย (รวดเร็วกว่าการเปรียบเทียบข้อมูลจาก string ธรรมดาแน่นอน)

สุดท้ายนี้ ถ้าไม่สามารถหาวิธีที่ดีกว่าได้ก็อาจจะต้องยอมให้ระบบอืดไปบ้างก็คดว่าไม่น่าจะเป็นอะไรครับ เหอๆ หรือจะเปลี่ยน Hardware ให้มากขึ้น
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-05-29 12:01:49 By : Songkram
 


 

No. 11



โพสกระทู้ ( 180 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

รบกวนให้คำแนะนำเกี่ยวกับการสร้าง index หน่อยนะคะ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-05-29 13:00:05 By : tai_kook
 


 

No. 12



โพสกระทู้ ( 74,058 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Facebook

SQL INDEX ครับ

Go to : SQL CREATE INDEX
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-05-29 13:06:07 By : mr.win
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : ขอถามเกี่ยวกับคำสั่ง sql ค่ะ ว่าจะใช้คำสั่งอย่างไรในการjoin ตารางเดียวกัน
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 03
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่