【问题标题】:Syntax error with "Rand()" function in MySQL in DelphiDelphi中MySQL中“Rand()”函数的语法错误
【发布时间】:2019-09-23 12:13:39
【问题描述】:

我正在尝试使用 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);

【问题讨论】:

    标签: mysql delphi-2010


    【解决方案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

    【讨论】:

    • 我使用了您的第一个解决方案,我得到“语法错误:查询表达式“Rand() LIMIT 1”中缺少运算符”
    • @MatthewKeys 您使用的是什么版本的 MySQL? official documentation中甚至出现了类似的例子,所以语法没问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    相关资源
    最近更新 更多