Po pierwsze, nie używasz RAND()
prawidłowo. Zwraca liczbę dziesiętną 0 <= N < 1
. Wartość wejściowa to ziarno, a nie górna granica, której oczekujesz. Aby uzyskać losową liczbę całkowitą między 0 <= N < Count
, musisz pomnożyć wynik, tj. RAND()*Count
, czego nie robisz. Ale nie musisz tego robić, możesz po prostu użyć RAND()
samo w sobie, nie ma potrzeby sprawdzania najpierw liczby rekordów:
qryCards.SQL.Text := 'SELECT * FROM tblCards WHERE Card_Rarity = "Epic" ORDER BY RAND() LIMIT 1';
qryCards.Open;
ShowMessage(qryCards.FieldByName('Card_Name').AsString);
W przeciwnym razie możesz wybrać losowy rekord, określając przesunięcie LIMIT
klauzula, np.:
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);
Jeśli Twoja tabela ma pole identyfikatora automatycznego zwiększania bez przerw, istnieją inne techniki, których możesz użyć RAND()
z. Zobacz Wybieranie losowych rekordów MySQL
po przykłady.