SQL выберите случайную строку - PullRequest
1 голос
/ 26 октября 2011

У меня проблемы с выбором случайной строки из базы данных 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);

У меня есть обходной путь, когда я использую первый оператор и перебираю результаты, помещая идентификаторы строк в массив, а затем выбираю случайный идентификатор из массива. Это прекрасно работает, но я бы предпочел сделать это прямо в одном утверждении.

Я видел этот вопрос, заданный ранее здесь, и сам гуглил его, но кажется, что порядок по случайности и ограничение до одного результата должны работать, мой синтаксис неправильный или что-то еще вызывает проблему?

Любой совет будет приветствоваться,

Спасибо

1 Ответ

4 голосов
/ 26 октября 2011

Обычно вы должны использовать следующий запрос в 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);

Проблема в том, что встроенная версия sqlite в chrome / firefox не поддерживает функцию 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); 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...