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.