2012-03-27 2 views
0

Grundsätzlich habe ich eine Datenbank von Worten,Objective c - SQLite Auswählen Zufallsreihe mit einem anderen Wert

Diese Datenbank eine rowID (Primärschlüssel) enthält, das Wort und die Wortlänge als Tabellenspalten.

Ich möchte eine zufällige Zeile mit der Länge = x auswählen und das Wort in dieser Zeile abrufen.

Dies ist für ein iPhone-Spiel Projekt und es ist hohe Priorität, dass die Abfragen so schnell wie möglich sind (die Suchvorgänge werden in einem Spiel gemacht).

Zum Beispiel:

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

Diese Abfrage ist wirklich schnell an eine zufällige Reihe BY RANDOM viel schneller als ORDER Auswahl() LIMIT 1, aber wenn ich die Wortlänge auf die Abfrage hinzufügen ich Fragen :

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

Vermutlich weil die zufällige Zeile nicht immer eine Länge von 9

hat ich frage mich, was der schnellste/effizienteste Weg, dies zu tun wäre.

Vielen Dank für Ihre Zeit

Hinweis: Die 2% Symbole sind, weil es in Objective-C, und die Abfrage wird als eine Zeichenfolge ist.

+0

Was sind die Probleme? – hamstergene

Antwort

1

Dieser zu arbeiten scheint ok für mich machen:

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

beachten Sie, dass length = 9 erscheint in beiden where Klauseln.

Hinzufügen Index auf length, wenn es scheint, langsam zu sein.

1

einen Index zum WordsDB.length hinzufügen

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

sollte Auswahl auf diesem Gebiet viel schneller