Цель c - SQLite, выбирающий случайную строку с другим значением - PullRequest
0 голосов
/ 27 марта 2012

В основном у меня есть база слов,

Эта база данных содержит идентификатор строки (первичный ключ), слово и длину слова в виде столбцов таблицы.

Я хочу выбрать случайную строку, где длина = х и получить слово в этой строке.

Это для игрового проекта для iPhone, и для него очень важно, чтобы запросы выполнялись как можно быстрее (поиски выполнялись в игре).

Например:

SELECT * FROM WordsDB WHERE >= (abs(random()) %% (SELECT max(rowid) FROM WordsDB)) LIMIT 1;

Этот запрос действительно быстр при выборе случайной строки намного быстрее, чем ORDER BY RANDOM () LIMIT 1, однако, если я добавлю длину слова в запрос, я получу проблемы:

SELECT * FROM WordsDB WHERE length = 9 AND rowid >= (abs(random()) %% (SELECT max(rowid) FROM WordsDB)) LIMIT 1

Предположительно, потому что случайная строка не всегда будет иметь длину 9.

Мне было просто интересно, что будет самым быстрым / наиболее эффективным способом сделать это.

Спасибо за ваше время

Примечание: символы 2%, потому что они находятся в цели c, а запрос задан в виде строки.

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Мне кажется, этот работает нормально:

select * from WordsDB 
where length = 9 
limit (abs(random()) % (select count(rowid) from WordsDB 
                        where length = 9)), 1;

обратите внимание, что length = 9 присутствует в обоих пунктах where.

Добавить индекс на length, если он кажется медленным.

1 голос
/ 27 марта 2012

Добавление индекса к WordsDB.length

create index if not exists WordsDBLengthIndex on WordsDB (length);

должно значительно ускорить выделение этого поля

...