Posts Tagged ‘ Random

Random row from a database

สืบเนื่องจากงานเก่าที่ผมเคยทำนั้น มีการ “สุ่ม” ข้อมูลออกมาโดยต้องการข้อมูลประมาณ 10 รายการจากทั้งหมด 100 รายการ คุณหัวหน้าเลยให้หาวิธีสุ่มข้อมูลให้ ซึ่งผมหาคิดได้ 2 ข้อดังนี้ เลยมาขอ Note ไว้กันลืม
1. การสุ่มโดยใช้ความสามารถของตัว Database เองวิธีนี้ผมคิดว่าน่าจะดีเพราะเมื่อทำงานใน Engine ของฐานข้อมูลเองนั้นย่อมให้ผลที่ดีกว่า เร็วกว่า แน่นอน (คิดเองนะครับ) ซึ่งจากการทดลองหาข้อมูลการ สุ่มของฐานข้อมูล Oracle ก็ไปเจอรูปแบบการสุ่มของฐานข้อมูลต่างๆ ดังนี้ครับ
MySQL

SELECT column FROM table
ORDER BY RAND()
LIMIT 1

PostgreSQL

SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1

Microsoft SQL Server

SELECT TOP 1 column FROM table
ORDER BY NEWID()

IBM DB2

SELECT column, RAND() as IDX 
FROM table 
ORDER BY IDX FETCH FIRST 1 ROWS ONLY

Oracle

SELECT column FROM( 
    SELECT column FROM table
   ORDER BY dbms_random.value 
)WHERE rownum = 1

2. การสุ่มโดยไม่ใช้ความสามารถของ Database ครับ วิธีนี้ผมคิดเอง ไม่รู้มันจะดีแค่ไหน แต่ก็เคยใช้วิธีนี้มาก่อนแล้วครับ ใครมีวิธีการที่ดีกว่านี้ก็แนะนำได้ครับ วิธีนี้เป็นดังนี้ครับ
ขั้นตอนที่ 1 ไป Query เอา Primary key ของข้อมูลที่ต้องการ สุ่มขึ้นมาก่อน จากนั้นก็จัดเก็บข้อมูลนั้นใน Array
ขั้นตอนที่ 2 นำข้อมูลใน Array ที่ได้จากข้อหนึ่งไปทำการ สลับตำแหน่งก่อน (Shuffle) แล้วก็ตัดเอาเฉพาะจำนวนที่ต้องการ ซึ่งความสามารถนี้น่าจะมีในทุกภาษานะ
ขั้นตอนที่ 3 เอาข้อมูลจากข้อ 2 ไป Query ข้อมูลจากฐานข้อมูลมาใหม่ครับ

จากการเสนอวิธีที่ผมคิดเองได้ดังกล่าวสองข้อ ท่านหัวหน้าบอกไม่ต้องคิดมาก เอาข้อแรกเลย เพราะข้อมูลเรามีไม่เยอะมาก ถ้าเยอะมากๆ นี่แบบแรกก็ไม่ไหว Query จะช้ามาก
หมายเหตุ :
ใครผ่านไปมา มีวิธีการที่ดีกว่านี้ก็แชร์ๆ กันได้ครับ
อ้างอิง (Credit)
SQL to Select a random row from a database table
ปัญหาเขียนโปรแกรมตอนแปด, แสดงค่าสุ่มตัวอย่างระหว่าง 1 ถึง 100