【问题标题】:SQL Select Random RowSQL 选择随机行
【发布时间】:2011-10-26 17:56:34
【问题描述】:

我在从 sqlite 数据库中选择随机行时遇到问题,这可以选择所有符合条件的行:

tx.executeSql('SELECT * FROM games WHERE genre="fps" AND decade=90', [], renderResultsTest);

如果我随后尝试仅随机检索其中一个,它将无法正常工作:

tx.executeSql('SELECT * FROM games WHERE genre="fps" AND decade=90 ORDER BY RANDOM() LIMIT 1', [], renderResultsTest);

我有一个解决方法,我使用第一条语句并循环遍历将行 ID 放入数组的结果,然后从数组中选择一个随机 ID。这很好用,但我更愿意直接在一个语句中完成。

我之前在这里看到过这个问题并自己用谷歌搜索过,但似乎随机顺序和限制为一个结果应该有效,是我的语法错误还是其他导致问题的原因?

欢迎任何建议,

谢谢

【问题讨论】:

  • 它在 sqlite 中的 RANDOM 显然是 sqlite.org/lang_corefunc.html 不过谢谢,无论如何都试过了,没有区别
  • 如果其他人读到这个,它似乎 random() 不会与 html5 本地存储一起工作,尝试在 chrome 和 safari 中。感谢朱尔斯的帮助。

标签: javascript sqlite


【解决方案1】:

通常您应该在 sqlite 中使用以下查询来选择单个随机行:

SELECT * FROM games WHERE genre="fps" AND decade=90 ORDER BY RANDOM() LIMIT 1;

所以通过 JQuery 执行此操作会是:

tx.executeSql('SELECT * FROM games WHERE genre="fps" AND decade=90 ORDER BY RANDOM() LIMIT 1', [], renderResultsTest);

问题是虽然 chrome/firefox 中嵌入的 sqlite 版本支持RANDOM() 函数。如果您尝试将RANDOM() 替换为id,则查询有效!

因此,解决此问题的唯一方法是检索所有记录,计算行数并生成介于 0 和行数 - 1 之间的随机数。然后您可以从数据集中选择该特定行并使用它一个。

tx.executeSql('SELECT * FROM games WHERE genre = "FPS" AND decade = 90 ORDER BY RANDOM() LIMIT 1', [], function (tx, result) { 
     var len = result.rows.length; 

     //generate random number
     var i = Math.floor(Math.random() * len);
     //get row
     var row = result.rows.item(i); 
});

【讨论】:

  • 对不起,我输入的不是复制粘贴,单引号问题实际上不在我的代码中,只是一个错字,我将编辑操作。还是不行。
  • 我刚刚在我自己的 Sqlite 中测试了这个。查询工作正常。出了什么问题?什么都不退?你们那里有那种类型和年代的游戏吗?
  • 是的,好几个,你介意告诉我你是如何测试它的,这样我就可以检查我做得是否正确
  • 我只是打开我的 sqlite 控制台,这样我就可以在我的 sqlite 数据库上手动编写和执行查询,所以我写了一个类似于你的查询来匹配我在我的数据库中拥有的表。它有效。也尝试这样做。
  • 啊对不起,我应该说我正在使用 html5 在 localstorage 中创建 sqlitedb 做所有事情,该查询在 chrome 或 safari 中对我没有任何作用
猜你喜欢
  • 2014-03-18
  • 2012-04-15
  • 1970-01-01
  • 2013-06-14
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 2015-06-09
相关资源
最近更新 更多