การ Query หลายๆเงื่อนไขแต่จบ กับการ Query ออกมาทีละเงื่อนไขแล้วนำค่าที่ได้มาวนลูปคำนวณ Query ใหม่ อันไหนดีกว่ากันครับ
ตามหัวข้อครับ
การ 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
Date :
2019-08-29 14:53:22
By :
10212315390173395
View :
1322
Reply :
4
ถ้าเป็นแค่การแสดงผล ให้ไปคำนวณแสดงผลที่ฝั่ง client เลยครับ ลดภาระ เครื่อง server ลง
แต่ถ้าเป็นการคำนวณ เช่นเพื่อแบ่ง group ก็ทำในdatabase server นั้นเลยครับ
Date :
2019-08-29 15:01:12
By :
Chaidhanan
ไม่ใช่ ครับ
ถ้าจะคำนวณเพื่อแสดงผล แค่รายการนั้นรายการเดียว
เช่น แปลงค่าวันที่ จาก 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
Load balance : Server 05