Упорядочить по полю с помощью SQLite - PullRequest
5 голосов
/ 22 июня 2010

Я на самом деле работаю над проектом Symfony на работе, и мы используем Lucene для нашей поисковой системы.Я пытался использовать базу данных SQLite в памяти для модульных тестов (мы используем MySQL), но наткнулся на кое-что.

В поисковой системе проекта используется индексация Lucene.По сути, вы запрашиваете его и получаете упорядоченный список идентификаторов, который можно использовать для запроса к базе данных с предложением Where In ().Проблема заключается в том, что в запросе есть предложение ORDER BY Field (id, ...), которое упорядочивает результат в том же порядке, что и результаты, возвращаемые Lucene.

Есть ли альтернатива ORDER BYПоле с использованием SQLite?Или есть другой способ упорядочить результаты так же, как это делает Lucene?

Спасибо:)

Редактировать:

Упрощенный запрос может выглядеть так:

SELECT i.* FROM item i
WHERE i.id IN(1, 2, 3, 4, 5)
ORDER BY FIELD(i.id, 5, 1, 3, 2, 4)

1 Ответ

2 голосов
/ 22 июня 2010

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

CREATE TABLE item (
    id INTEGER PRIMARY KEY ASC,
    thing TEXT);

INSERT INTO item (thing) VALUES ("thing 1");
INSERT INTO item (thing) VALUES ("thing 2");
INSERT INTO item (thing) VALUES ("thing 3");

CREATE TEMP TABLE ordered (
    id INTEGER PRIMARY KEY ASC,
    item_id INTEGER);

INSERT INTO ordered (item_id) VALUES (2);
INSERT INTO ordered (item_id) VALUES (3);
INSERT INTO ordered (item_id) VALUES (1);

SELECT item.thing
FROM item
JOIN ordered
ON ordered.item_id = item.id
ORDER BY ordered.id;

Вывод:

thing 2
thing 3
thing 1

Да, это тот тип SQL, который заставляет людей дрожать, ноЯ не знаю SQLite эквивалента для ORDER BY FIELD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...