For det første bruger du ikke RAND()
korrekt. Det returnerer et decimaltal 0 <= N < 1
. Indgangsværdien er et frø, ikke en øvre grænse, som du forventer. For at få et tilfældigt heltal mellem 0 <= N < Count
, skal du multiplicere resultatet, dvs. RAND()*Count
, hvilket du ikke gør. Men du behøver ikke at gøre det, du kan bare bruge RAND()
i sig selv er der ingen grund til at forespørge om registreringsantallet først:
qryCards.SQL.Text := 'SELECT * FROM tblCards WHERE Card_Rarity = "Epic" ORDER BY RAND() LIMIT 1';
qryCards.Open;
ShowMessage(qryCards.FieldByName('Card_Name').AsString);
Ellers kan du vælge en tilfældig post ved at angive en offset til LIMIT
klausul, f.eks.:
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);
Hvis din tabel har et auto-increment id-felt uden huller i det, er der andre teknikker, du kan bruge RAND()
med. Se MySQL Select Random Records
for eksempler.