Pertama, Anda tidak menggunakan RAND()
benar. Ini mengembalikan angka desimal 0 <= N < 1
. Nilai input adalah benih, bukan batas atas seperti yang Anda harapkan. Untuk mendapatkan bilangan bulat acak antara 0 <= N < Count
, Anda harus mengalikan hasilnya, yaitu RAND()*Count
, yang tidak Anda lakukan. Tapi Anda tidak perlu melakukannya, Anda bisa menggunakan RAND()
dengan sendirinya, tidak perlu menanyakan jumlah record terlebih dahulu:
qryCards.SQL.Text := 'SELECT * FROM tblCards WHERE Card_Rarity = "Epic" ORDER BY RAND() LIMIT 1';
qryCards.Open;
ShowMessage(qryCards.FieldByName('Card_Name').AsString);
Jika tidak, Anda dapat memilih catatan acak dengan menentukan offset ke LIMIT
klausa, misalnya:
qryCards.SQL.Text := 'SELECT * FROM tblCards WHERE Card_Rarity = "Epic"';
qryCards.Open;
iCount := qryCards.RecordCount;
qryCards.Close;
qryCards.SQL.Text := 'SELECT * FROM tblCards WHERE Card_Rarity = "Epic" LIMIT ' + IntToStr(Random(iCount)) + ', 1');
qryCards.Open;
ShowMessage(qryCards.FieldByName('Card_Name').AsString);
Jika tabel Anda memiliki bidang id kenaikan otomatis tanpa celah di dalamnya, ada teknik lain yang dapat Anda gunakan RAND()
dengan. Lihat MySQL Select Random Records
sebagai contoh.