Trước hết, bạn không sử dụng RAND()
một cách chính xác. Nó trả về một số thập phân 0 <= N < 1
. Giá trị đầu vào là một hạt giống, không phải là một giới hạn trên như bạn đang mong đợi. Để nhận một số nguyên ngẫu nhiên giữa 0 <= N < Count
, bạn phải cộng nhiều kết quả, tức là RAND()*Count
, mà bạn không làm. Nhưng bạn không cần phải làm điều đó, bạn chỉ có thể sử dụng RAND()
tự nó, không cần phải truy vấn số lượng bản ghi trước:
qryCards.SQL.Text := 'SELECT * FROM tblCards WHERE Card_Rarity = "Epic" ORDER BY RAND() LIMIT 1';
qryCards.Open;
ShowMessage(qryCards.FieldByName('Card_Name').AsString);
Nếu không, bạn có thể chọn một bản ghi ngẫu nhiên bằng cách chỉ định độ lệch cho LIMIT
mệnh đề, ví dụ:
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);
Nếu bảng của bạn có trường id tăng tự động không có khoảng trống trong đó, bạn có thể sử dụng các kỹ thuật khác để sử dụng RAND()
với. Xem MySQL Chọn bản ghi ngẫu nhiên
để làm ví dụ.