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

Registered : 107,912

HOME > PHP > PHP Forum > การ Query หลายๆเงื่อนไขแต่จบ กับการ Query ออกมาทีละเงื่อนไขแล้วนำค่าที่ได้มาวนลูปคำนวณ Query ใหม่ อันไหนดีกว่ากันครับ



 

การ Query หลายๆเงื่อนไขแต่จบ กับการ Query ออกมาทีละเงื่อนไขแล้วนำค่าที่ได้มาวนลูปคำนวณ Query ใหม่ อันไหนดีกว่ากันครับ

 



Topic : 134099



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



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



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

Code (SQL)
SELECT
	*,
	CASE
		WHEN subQuery1.paymentDay != '' AND subQuery1.paymentDay IS NOT NULL AND subQuery1.paymentDay > 0
			THEN ROUND( (( ( 27 * 12 ) / DAYOFYEAR( CONCAT( YEAR ( NOW( ) ), '-12-31' ) ) ) * subQuery1.area * subQuery1.paymentDay ),4 )
			ELSE ROUND( (( ( 27 * 12 ) / DAYOFYEAR( CONCAT( YEAR ( NOW( ) ), '-12-31' ) ) ) * subQuery1.area * 11 ),4 )
	END AS paymentPrice
FROM
	(
SELECT
	units.unit_id,
	addresses.address_id,
	addresses.address_name,
	addresses.area,
	addresses.transfer_date,
	addresses.transfer_status,
	SUBSTRING_INDEX( SUBSTRING_INDEX( addresses.transfer_date, '/', 2 ), '/', - 1 ) AS transferDay,
	DAY ( LAST_DAY( '2018-08-01' ) ) AS dayInMonth,
CASE
	
	WHEN addresses.transfer_date != '' 
	AND addresses.transfer_date IS NOT NULL THEN
CASE

WHEN SUBSTRING_INDEX( addresses.transfer_date, '/', - 1 ) = '2016' 
	AND SUBSTRING_INDEX( addresses.transfer_date, '/', 1 ) = '07' THEN
		SUBSTRING_INDEX( SUBSTRING_INDEX( addresses.transfer_date, '/', 2 ), '/', - 1 ) - 1 ELSE NULL 
END ELSE NULL 
	END AS paymentDay,
	central_bill.central_bill_id,
	central_bill.MONTH,
	central_bill.YEAR,
	central_bill.price_total,
	central_bill.send,
	central_bill.STATUS,
	central_bill.paydate,
	central_bill.CODE,
	central_bill.code_rc 
FROM
	units
	INNER JOIN addresses ON units.address_id = addresses.address_id 
	AND addresses.transfer_status = '0' 
	AND addresses.building_id = '7'
	LEFT JOIN central_bill AS central_bill ON units.unit_id = central_bill.unit_id 
	AND central_bill.MONTH = '7' 
	AND central_bill.YEAR = '2019' 
) AS subQuery1


นี่เป็นตัวอย่างโค้ดที่ผมได้ทำการ Query ออกมา จะเห็นได้ว่าฟังก์ชั่นหลายๆอย่างที่ผมใช้ทั้ง CASE / SUBSTRING_INDEX / LAST_DAY / Sub Query มันสามารถเอาออกมาทีละชุดแล้วให้หน้าบ้านคำนวณแทนก็ได้
** อันนี้อาจจะแค่เคสที่มีการคำนวณไม่มาก แต่ถ้าคิดภาพถ้ามันมีการใช้ฟังก์ชั่นเยอะๆ มากกว่านี้หลายเท่า เราควรแบ่งออกเป็นหลายๆ Query ทีละสเตปเพื่อไม่ให้ฐานข้อมูลเราเกิดคอขวดหรือเปล่า

** ถามเป็นความรู้เท่านั้นครับ ขอบคุณครับ



Tag : PHP, MySQL, MySQL, PostgreSQL, Node.js, Windows







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2019-08-29 14:53:22 By : 10212315390173395 View : 89 Reply : 4
 

 

No. 1



โพสกระทู้ ( 7,977 )
บทความ ( 2 )



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


ถ้าเป็นแค่การแสดงผล ให้ไปคำนวณแสดงผลที่ฝั่ง client เลยครับ ลดภาระ เครื่อง server ลง
แต่ถ้าเป็นการคำนวณ เช่นเพื่อแบ่ง group ก็ทำในdatabase server นั้นเลยครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-08-29 15:01:12 By : Chaidhanan
 


 

No. 2



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



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

ตอบความคิดเห็นที่ : 1 เขียนโดย : Chaidhanan เมื่อวันที่ 2019-08-29 15:01:12
รายละเอียดของการตอบ ::
หมายความว่าถ้ามีการคำนวณที่สามารถทำในการ Query ได้ ให้ทำในนั้นไปเลยจะดีกว่าใช่ไหมครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-08-31 12:28:02 By : 10212315390173395
 

 

No. 3



โพสกระทู้ ( 7,977 )
บทความ ( 2 )



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


ไม่ใช่ ครับ
ถ้าจะคำนวณเพื่อแสดงผล แค่รายการนั้นรายการเดียว
เช่น แปลงค่าวันที่ จาก 2019-08-31 เป็น เสาร์ที่ 31 สิงหาคม 2562 ให้ส่ง 2019-08-31 ไปให้ client คำนวณครับ

แต่ถ้าเป็นการคำนวณ เพื่อ ไว้ใช้การการ แบ่งข้อมูล เช่นการ group หาจำนวน min max avg ค่อยทำที่ database server
เช่นถ้าข้อมูล เป็น ล้าน เรคคอร์ด เพื่อที่จะแสดงยอดรวม ยอด avg คุณจะส่งข้อมูลดิบไปคำนวณที่ฝั่ง client ไหมล่ะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-08-31 13:25:20 By : Chaidhanan
 


 

No. 4



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



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

ตอบความคิดเห็นที่ : 3 เขียนโดย : Chaidhanan เมื่อวันที่ 2019-08-31 13:25:20
รายละเอียดของการตอบ ::
ถ้ามีเคสแบบนี้
DateA: ส่งมาเป็น mm/dd/yyyy = 06/15/2019
DateB: ส่งมาเป็น mm/dd/yyyy = 03/27/2020
ผมต้องการหาความจำนวนวันระหว่าง 2 วันที่นี้
โดยมีปริมาณข้อมูลประมาณ 50,000 record
จากนั้น SubString หรือ DATE_FORMAT วันที่ทั้ง 2 นี้ให้อยู่ในรูป yyyy/mm/dd จะได้
DateC: 2019-06-15 ถึง
DateD: 2020-03-27
โดยผ่านการ Query Database Server และใช้ฟังก์ชั่น DATE_DIFF ของ MySQL จะได้จำนวนวันออกมาเลยทั้ง 50,000 record
** หรือผมควรเอาวันที่ทั้ง 2 วันนี้ออกมาในรูปที่ส่งมาแบบดาดๆ(DateA,DateB)แล้ววนลูปเข้าฟังก์ชั่นหาจำนวนวันที่ฝั่ง Client ทีละ record เอาแบบไหนจะดีกว่ากันครับ



ประวัติการแก้ไข
2019-09-02 16:48:53
2019-09-02 16:49:48
2019-09-02 16:52:59
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-09-02 16:47:48 By : 10212315390173395
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : การ Query หลายๆเงื่อนไขแต่จบ กับการ Query ออกมาทีละเงื่อนไขแล้วนำค่าที่ได้มาวนลูปคำนวณ Query ใหม่ อันไหนดีกว่ากันครับ
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ 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: Voake, Comcube, รับทำเว็บไซต์ รับเขียนโปรแกรม

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