จากบทความ Retrieving the last record in each groupจะเป็นการ JOIN แบบเลือกรายการล่าสุด เช่นกรณีที่ข้อมูลในตารางหลัก มีการเปลี่ยนแปลงรุ่น เปลี่ยนเวอร์ชั่น แต่ยังคงใช้รหัสเดิม และต้องการแค่ข้อมูลเวอร์ชั่นล่าสุดเรคอร์ดเดียวเท่านั้น
SELECT product.*,tb_category.name AS cate_name FROM product
LEFT JOIN tb_category ON product.category_code = tb_category.code
WHERE product.name LIKE '%กรรไกร%'
เราจะทำการ GROUP รหัสสินค้า เพื่อลดจำนวนเรคอร์ดที่ซ้ำซ้อนออกไป
SELECT product.* , tb_category.name AS cate_name , tb_category.start_used_date
FROM product
LEFT JOIN tb_category ON product.category_code = tb_category.code
WHERE product.name LIKE '%กรรไกร%'
GROUP BY product.id
โดยกำหนด Sub Query ให้เลือกเฉพาะรายการที่เปิดใช้งานก่อนนำไปใช้งานในครั้งนั้นๆ
SELECT product.* , cate.name AS cate_name , cate.start_used_date
FROM product
LEFT JOIN tb_category cate ON cate.id = ( SELECT MAX(bb.id)
FROM tb_category AS bb
WHERE bb.code = product.category_code
AND bb.start_used_date <= product.active_date
)
WHERE product.name LIKE '%กรรไกร%'
GROUP BY product.id
เมื่อเราเพิ่มเงื่อนไข start_used_date <= product.active_date เข้าไปใน Sub Query ก็จะได้ ID ของเรคอร์ดที่เปิดใช้งานในช่วง active_date ของรายการนั้นๆ ซึ่งตรงกับที่เกิดขึ้นจริง
หลังจากเปิด Windows Firewall โปรแกรมไม่สามารถเชื่อมต่อฐานข้อมูล MySQL จากเครื่อง Client ได้
แต่เชื่อมผ่าน Localhost ได้
ให้เข้าไปเปิดที่ Control panel > Windows Firewall > Allow a program or feature through Windows Firewall เพื่อกำหนดให้ MySQL ที่เราติดตั้งไว้สามารถทำงานผ่าน Firewall ได้
หลังจากกด OK ลองกลับไปหน้าล็อกอินผ่านโปรแกรมจัดการฐานข้อมูลที่เครื่อง Client อีกครั้ง
ท่านใดใช้เครื่องมือจัดการฐานข้อมูลที่เครื่อง Client เชื่อมต่อไปยัง Server แล้วเชื่อมต่อไม่ได้ ลองตรวจสอบการตั้งค่า Windows Firewall ดูนะครับ
ข้อสังเกต
ไม่ได้เกิดจากการตั้ง Host name ของ MySQL User เพราะตั้งเป็น % เรียบร้อย (คือเชื่อมต่อได้จากทุก iP) แต่ถ้าตั้งค่า Host name แล้วแต่ยังไม่ได้จะมีข้อความแจ้งเตือนอีกแบบ
Access denied for '.....'@ 'เลขไอพีหรือComputername'
ซึ่งถ้าสั่งคิวรี่คำสั่ง
flush privileges;
ใน phpMyAdmin (ซึ่งล็อกอินด้วย user เดียวกันนี้ได้ปกติ) ก็จะทำการเชื่อมต่อจากไอพีด้านนอกได้
function sendPos(event){ myMove(event.offsetX , event.offsetY ); }
สังเกตุว่าการเคลื่อนย้ายจะไม่เป็นเส้นตรง เพราะตำแหน่ง X และ Y ไม่เท่ากัน ดังนั้นเมื่อถึงตำแหน่งแนวไหนก่อน ก็จะเคลื่อนไปอีกแนวเท่านั้น
แนวทางการปรับปรุงโค้ดให้การเคลื่อนที่เป็นเส้นตรง
ยกตัวอย่าง x = 78 , y = 264
ให้ยึดค่าที่มากกว่าเป็นหลัก นั่นคือแกน y จะขยับอยู่ 264 ครั้ง
ดังนั้น ต้องนำค่าแกน x มาเฉลี่ยให้ได้ 264 ครั้งด้วยสูตร min / max นั่นก็คือ 78 / 264 = 0.295