GORAGOD.com

freelance, web developer, web designer, hosting, domain name

MySQL Query ข้อมูลล่าสุดรายการละ 1 แถว เรียงลำดับตามคอลัมน์มากกว่า 1 คอลัมน์

MySQL Query ข้อมูลล่าสุดรายการละ 1 แถว เรียงลำดับตามคอลัมน์มากกว่า 1 คอลัมน์
ตัวอย่างนี้จะอธิบายวิธีการเขียน QUERY ของ MySQL เอาข้อมูลรายการล่าสุดออกมา โดยมีเงื่อนไขว่า หากเงื่อนไขแรกเท่ากัน จะไปตรวจสอบเงื่อนไขที่สองอีกที

ดูตัวอย่างข้อมูลตามตารางด้านล่าง
จากตัวอย่างข้อมูล ในกรณีที่ต้องการข้อมูลเพียงแถวเดียวการ Query จะไม่ซับซ้อนเท่าไร สามารถใช้การ ORDER BY ตามที่ต้องการได้เลย เช่น ต้องการรายการที่ Name เท่ากับ Jane โดยเป็นรายการที่มี Age มากที่สุด ในกรณีที่ Age เท่ากันให้เลือกแถวที่มี ID ล่าสุด (Age และ ID มากที่สุดทั้งคู่)
SELECT ID, Name, Age
FROM your_table
WHERE Name = 'Jane'
ORDER BY Age DESC, ID DESC
LIMIT 1;

จากตัวอย่าง Jane จะมี 2 รายการ Age เท่ากัน ดังนั้น ID ล่าสุดก็คือ 4 ผลลัพท์ดังตาราง
ในกรณีที่ต้องการข้อมูลเป็นลิสต์รายการที่มี Name ไม่ซ้ำกัน จะต้องอาศัยการ JOIN ข้อมูลร่วมด้วย เพราะการ ORDER BY เพียงอย่างเดียวไม่สามารถตัดแถวที่มีข้อมูล (Name) ซ้ำกันได้ เข่นต้องการรายการที่มี Name ไม่ซ้ำกันและมี Age มากที่สุด โดยที่ในกรณีที่ Age เท่ากันให้เลือกแถวที่มี ID ล่าสุด สามารถเขียน Query ได้ดังนี้
SELECT t1.ID, t1.Name, t1.Age
FROM your_table t1
LEFT JOIN your_table t2 ON t1.Name = t2.Name AND (t1.Age < t2.Age OR (t1.Age = t2.Age AND t1.ID < t2.ID))
WHERE t2.ID IS NULL;

อธิบายบรรทัด JOIN นะครับ
  1. ขั้นแรกจะมีการจับคู่แถวที่มี Name เดียวกันก่อน (t1.Name = t2.Name)
  2. และตรวจสอบว่าเป็นแถวที่มี Age น้อยกว่าหรือไม่ (t1.Age < t2.Age) ถ้าใช่ ก็คืนค่าแถวนั้น
  3. ในกรณีที่ Age เท่ากัน จะไปตรวจว่า ID น้อยกว่ากันหรือไม่ ถ้าใช่ ก็คืนค่าแถวนั้นเช่นกัน
  4. แถวที่เป็นรายการที่ Age และ ID มากที่สุดจะคืนค่า NULL (เพราะจับคู่กับใครไม่ได้ เนื่องจากไม่เข้าเงื่อนไขใน ON)
และสุดท้ายถึงจะเลือกแถวที่ผลลัพท์เป็น NULL (ไม่มีรายการไหนมากกว่าแถวนี้แล้ว) ได้ผลลัพท์ดังตาราง
ในกรณีที่ต้องการข้อมูลที่มี Name ไม่ซ้ำกัน ที่มี Age น้อยที่สุด และในกรณีที่ Age เท่ากันให้เลือกแถวที่มี ID น้อยที่สุด สิ่งที่แตกต่างกันคือการ JOIN ทีทำกลับกันเท่านั้น
SELECT t1.ID, t1.Name, t1.Age
FROM your_table t1
LEFT JOIN your_table t2 ON t1.Name = t2.Name AND (t1.Age > t2.Age OR (t1.Age = t2.Age AND t1.ID > t2.ID))
WHERE t2.ID IS NULL;

ได้ผลลัพท์ดังตาราง
0SHAREFacebookLINE it!
^