Tout d'abord, vous n'utilisez pas RAND()
correctement. Il renvoie un nombre décimal 0 <= N < 1
. La valeur d'entrée est une graine, pas une limite supérieure comme vous l'attendez. Pour obtenir un nombre entier aléatoire entre 0 <= N < Count
, vous devez multiplier le résultat, c'est-à-dire RAND()*Count
, ce que vous ne faites pas. Mais vous n'avez pas besoin de le faire, vous pouvez simplement utiliser RAND()
par lui-même, il n'est pas nécessaire de demander d'abord le nombre d'enregistrements :
qryCards.SQL.Text := 'SELECT * FROM tblCards WHERE Card_Rarity = "Epic" ORDER BY RAND() LIMIT 1';
qryCards.Open;
ShowMessage(qryCards.FieldByName('Card_Name').AsString);
Sinon, vous pouvez sélectionner un enregistrement aléatoire en spécifiant un décalage au LIMIT
clause, par exemple :
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);
Si votre table a un champ d'identification à incrémentation automatique sans espace, il existe d'autres techniques que vous pouvez utiliser RAND()
avec. Voir MySQL Select Random Records
pour des exemples.