我在从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。这很好但我更喜欢直接在一个声明中。
我之前在这里看到过这个问题,并且我自己搜索了一下这个问题,但似乎随机的顺序和限制一个结果应该有效,是我的语法错误还是导致问题的其他原因?
欢迎任何建议,
由于
答案 0 :(得分:4)
通常你应该在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);
});