Primeiro, você não está usando
RAND()
corretamente. Retorna um número decimal 0 <= N < 1
. O valor de entrada é uma semente, não um limite superior como você espera. Para obter um número inteiro aleatório entre 0 <= N < Count
, você tem que multiplicar o resultado, ou seja, RAND()*Count
, o que você não está fazendo. Mas você não precisa fazer isso, você pode apenas usar RAND()
por si só, não há necessidade de consultar a contagem de registros primeiro:qryCards.SQL.Text := 'SELECT * FROM tblCards WHERE Card_Rarity = "Epic" ORDER BY RAND() LIMIT 1';
qryCards.Open;
ShowMessage(qryCards.FieldByName('Card_Name').AsString);
Caso contrário, você pode selecionar um registro aleatório especificando um deslocamento para o
LIMIT
cláusula, por exemplo: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);
Se sua tabela tiver um campo de id de incremento automático sem lacunas, existem outras técnicas que você pode usar
RAND()
com. Veja MySQL Select Random Records
por exemplo.