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,037

HOME > PHP > PHP Forum > สอบถามวิธีเขียน SQL คิวรี่ หรือขั้นตอนการเรียกข้อมูลจากตารางที่สัมพันธ์กัน 3 ตาราง



 

สอบถามวิธีเขียน SQL คิวรี่ หรือขั้นตอนการเรียกข้อมูลจากตารางที่สัมพันธ์กัน 3 ตาราง

 



Topic : 110865



โพสกระทู้ ( 1,994 )
บทความ ( 10 )



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



012345

จากรูปข้อมูลที่ต้องการคือ กรณีที่ 2.8 ค้นหารหัสเอกสารที่ลงทะเบียนเข้า และยังไม่เสร็จสิ้นกระบวนการ

tb_doc_regis = ตารางการลงทะเบียน
tb_doc_reject = ตารางการส่งคืนแก้ไข
tb_doc_complete = ตารางการเบิกจ่ายเรียบร้อย

เงื่อนไขที่ใช้ค้นหาในตารางหลัก tb_doc_regis
1. ต้องหารายการเอกสารที่รับเข้าแล้ว ไม่มีการส่งคืน(tb_doc_reject) หรือวันที่ส่งคืนน้อยกว่ารับเข้า
2. เอกสารทั้งหมดที่รับเข้านั้น จะต้องยังไม่ได้ขึ้นสถานะ “จ่ายแล้ว” (tb_doc_complete)

ฟิลด์ที่ใช้อ้างอิงคือ doc_id

ผมลองใช้ LEFT JOIN กับ WHERE NOT EXISTS แล้วช้ามากๆ จนค้างไปเลยทั้งสองกรณี ใครพอมีวิธีแนะนำบ้างครับ



Tag : PHP, MySQL







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2014-08-25 14:34:29 By : {Cyberman} View : 1156 Reply : 5
 

 

No. 1



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

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

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

ใช้ subquery ไม่ได้เหรอครับ

Code (SQL)
SELECT `doc_id` FROM `tb_doc_regis`
WHERE
`doc_id` NOT IN (SELECT `doc_id` FROM `tb_doc_reject` WHERE เงื่อนไข AND เงื่อนไข ...)
AND `doc_id` NOT IN (SELECT `doc_id` FROM `tb_doc_complete`)


อาจจะดูเหมือนช้า แต่ subquery จะทำครั้งเดียวหากเงื่อนไขของ subquery เป็นเงื่อนไข static






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-08-25 15:08:39 By : phpinfo()
 


 

No. 2



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

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

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

INNER JOIN LEFT JOIN RIGHT JOIN
https://www.thaicreate.com/asp/asp-sql-join-table.html
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-08-25 15:10:27 By : Dragons_first
 

 

No. 3



โพสกระทู้ ( 1,994 )
บทความ ( 10 )



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

ถ้าเราเพิ่ม WHERE เยอะๆ เพื่อกรองให้ข้อมูลเหลือน้อยๆ จะทำให้ช้า หรือว่าเร็วขึ้นครับ
เช่น เพิ่มเงื่อนไขเข้าไปกรองเฉพาะข้อมูลภายในปีนี้

เดี๋ยวจะลองทดสอบ subquery กับ left join ดูว่าแบบไหนจะเร็วกว่ากัน

หรือถ้าสร้าง View ไปเลยจะดีกว่ารึเปล่าครับ?
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-08-25 15:28:31 By : {Cyberman}
 


 

No. 4



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

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

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

ตอบความคิดเห็นที่ : 3 เขียนโดย : {Cyberman} เมื่อวันที่ 2014-08-25 15:28:31
รายละเอียดของการตอบ ::
ถ้า column ที่ WHERE ทุกตัวมี index จะเร็วที่สุดครับ ยิ่งกรองข้อมูลให้เหลือน้อยที่สุดก็ยิ่งดีครับ

สมมติคุณมี tb_doc_complete 1000000 แถว มันก็เอามาหมดครับ ถึงแม้จะ SELECT เฉพาะ doc_id ก็ตามที นั่นหมายถึงจะต้องใช้ cache สำหรับ doc_id 1000000 แถวนั้นเพื่อ NOT IN ใน query หลัก

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

แต่ถ้าใช้ sub query แล้วตารางรองที่ SELECT มีจำนวนแถวน้อย sub query จะเร็วกว่าแน่นอนครับ
ทั้งนี้ขึ้นอยู่กับ index ด้วย

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-08-25 16:12:40 By : phpinfo()
 


 

No. 5



โพสกระทู้ ( 1,994 )
บทความ ( 10 )



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

ขอบคุณสำหรับข้อมูลครับ

เมื่อวานผมได้ลองใช้ทั้ง JION และ sub query ปรากฏว่าช้ามากครับ มันมีเงื่อนไขเพิ่มขึ้นมาอีกจากเดิมที่คิดไว้เพียงแค่ 3 ตาราง แต่กลางเป็นว่าตาราง tb_doc_reject กับ tb_doc_complete เป็นตารางแบบมีตารางหลักพ่วงอยู่ด้วย ทั้งสองตารางนี้เป็นเพียงตารางรายการเท่านั้น

ถ้าจะหาวันที่ reject ก็ต้อง JOIN เพิ่มอีก 1 ตาราง
ถ้าจะหารายการที่ complete ก็ต้อง JOIN ตารางรายการเพิ่มอีก 1 ตาราง


ตอนนี้เลยตัดสินใจว่า
1. สร้างตารางใหม่มีฟิลด์เก็บสถานะทุกสถานะไปเลย แล้ววนลูปหาข้อมูลมา Insert ทีละสถานะ หรือ
2. แก้ตาราง reject ให้นำวันที่ส่งคืนจากตารางหลักมาเพิ่มอีก 1 ฟิลด์ และก็เพิ่มส่วนของรายละเอียด complete ไปในตารางรายการย่อยด้วย
(แต่แบบที่ 2 นี้เหมือนจะเปลืองพื้นที่โดยไม่จำเป็น = =')
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-08-26 07:26:27 By : {Cyberman}
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : สอบถามวิธีเขียน SQL คิวรี่ หรือขั้นตอนการเรียกข้อมูลจากตารางที่สัมพันธ์กัน 3 ตาราง
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ 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 00
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 อัตราราคา คลิกที่นี่