Ten eerste, je gebruikt RAND()
. niet correct. Het geeft een decimaal getal terug 0 <= N < 1
. De invoerwaarde is een seed, geen bovengrens zoals u verwacht. Om een willekeurig geheel getal te krijgen tussen 0 <= N < Count
, moet u het resultaat vermenigvuldigen, bijv. RAND()*Count
, wat u niet doet. Maar u hoeft dat niet te doen, u kunt gewoon RAND()
. gebruiken op zichzelf is het niet nodig om eerst het aantal records op te vragen:
qryCards.SQL.Text := 'SELECT * FROM tblCards WHERE Card_Rarity = "Epic" ORDER BY RAND() LIMIT 1';
qryCards.Open;
ShowMessage(qryCards.FieldByName('Card_Name').AsString);
Anders kunt u een willekeurig record selecteren door een offset op te geven voor de LIMIT
clausule, bijvoorbeeld:
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);
Als uw tabel een auto-increment id-veld heeft zonder gaten erin, zijn er andere technieken die u kunt gebruiken RAND()
met. Zie MySQL Willekeurige records selecteren
voor voorbeelden.