SQLite - ЗАКАЗАТЬ ПО RAND ()

Я переписал ваш код в vanilla-js, используя методы DOM, чтобы предотвратить инъекцию html.

Демо

var _table_ = document.createElement('table'),
    _tr_ = document.createElement('tr'),
    _th_ = document.createElement('th'),
    _td_ = document.createElement('td');

// Builds the HTML Table out of myList json data from Ivy restful service.
 function buildHtmlTable(arr) {
     var table = _table_.cloneNode(false),
         columns = addAllColumnHeaders(arr, table);
     for (var i=0, maxi=arr.length; i < maxi; ++i) {
         var tr = _tr_.cloneNode(false);
         for (var j=0, maxj=columns.length; j < maxj ; ++j) {
             var td = _td_.cloneNode(false);
                 cellValue = arr[i][columns[j]];
             td.appendChild(document.createTextNode(arr[i][columns[j]] || ''));
             tr.appendChild(td);
         }
         table.appendChild(tr);
     }
     return table;
 }

 // Adds a header row to the table and returns the set of columns.
 // Need to do union of keys from all records as some records may not contain
 // all records
 function addAllColumnHeaders(arr, table)
 {
     var columnSet = [],
         tr = _tr_.cloneNode(false);
     for (var i=0, l=arr.length; i < l; i++) {
         for (var key in arr[i]) {
             if (arr[i].hasOwnProperty(key) && columnSet.indexOf(key)===-1) {
                 columnSet.push(key);
                 var th = _th_.cloneNode(false);
                 th.appendChild(document.createTextNode(key));
                 tr.appendChild(th);
             }
         }
     }
     table.appendChild(tr);
     return columnSet;
 }

64
задан Alix Axel 10 August 2009 в 12:01
поделиться

3 ответа

с использованием random () :

SELECT foo FROM bar
  WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
  LIMIT 1;

РЕДАКТИРОВАТЬ (по QOP): Поскольку документы на SQLite Autoincrement ed столбцы заявляют, что:

Обычный алгоритм выбора ROWID, описанный выше , будет генерировать монотонно увеличивающиеся уникальные идентификаторы ROWID , если вы никогда не используете максимальное значение ROWID, и вы никогда не удалите запись в таблице с самый большой ROWID. Если вы когда-нибудь удаляете строки, то ROWID из ранее удаленные строки могут быть повторно использованы при создании новых строк .

Вышесказанное верно только в том случае, если у вас нет столбца INTEGER PRIMARY KEY AUTOINCREMENT (он все равно будет работать с INTEGER PRIMARY KEY столбцы). В любом случае, это должно быть более переносимым / надежным:

SELECT foo FROM bar
  WHERE _ROWID_ >= (abs(random()) % (SELECT max(_ROWID_) FROM bar))
LIMIT 1;

ROWID , _ROWID_ и OID - все это псевдонимы для внутреннего идентификатора строки SQLite.

49
ответ дан 24 November 2019 в 15:37
поделиться
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
130
ответ дан 24 November 2019 в 15:37
поделиться

Решено:

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
35
ответ дан 24 November 2019 в 15:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: