Delphi中MySQL中“ Rand()”函数的语法错误

时间:2019-09-23 12:13:39

标签: mysql delphi-2010

我试图在MySQL中使用Rand()函数选择随机记录,但在Rand()LIMIT行中遇到语法错误

qryCards.SQL.Add('SELECT * FROM tblCards WHERE Card_Rarity = "Epic"');
                  qryCards.Open;
                  iCount := qryCards.RecordCount;
                  qryCards.Close;
                  qryCards.SQL.Clear;
                  qryCards.SQL.Add('SELECT * FROM tblCards ORDER BY rand(' + IntToStr(iCount) + ') LIMIT 1');
                  qryCards.Open;
                  ShowMessage(qryCards.FieldByName('Card_Name').AsString);

1 个答案:

答案 0 :(得分:1)

首先,您没有正确使用RAND()。它返回一个十进制数字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 Random Records