まず、RAND()
を使用していません 正しく。 10進数を返します0 <= N < 1
。入力値はシードであり、期待しているような上限ではありません。 0 <= N < Count
の間のランダムな整数を取得するには 、結果を倍数にする必要があります。つまり、RAND()*Count
、あなたはしていません。ただし、これを行う必要はありません。RAND()
を使用するだけです。 それ自体では、最初にレコード数を照会する必要はありません:
qryCards.SQL.Text := 'SELECT * FROM tblCards WHERE Card_Rarity = "Epic" ORDER BY RAND() LIMIT 1';
qryCards.Open;
ShowMessage(qryCards.FieldByName('Card_Name').AsString);
それ以外の場合は、LIMIT
へのオフセットを指定してランダムレコードを選択できます 句、例:
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);
テーブルにギャップのない自動インクリメントIDフィールドがある場合は、RAND()
を使用できる他の手法があります。 と。 MySQL Select RandomRecords
を参照してください。 例として。