Я переписал ваш код в 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;
}
с использованием 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.
Решено:
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;