2010-06-22 12 views
5

Estoy trabajando en un proyecto de Symfony en el trabajo y estamos utilizando Lucene para nuestro motor de búsqueda. Estaba tratando de usar la base de datos en memoria de SQLite para pruebas unitarias (estamos usando MySQL) pero me encontré con algo.Ordenar por campo con SQLite

La parte del motor de búsqueda del proyecto utiliza la indexación de Lucene. Básicamente, lo consulta y obtiene una lista ordenada de identificadores, que puede usar para consultar su base de datos con una cláusula Where In(). El problema es que hay una cláusula ORDER BY Field (id, ...) en la consulta, que ordena el resultado en el mismo orden que los resultados devueltos por Lucene.

¿Hay alguna alternativa al campo ORDER BY usando SQLite? ¿O hay otra forma de ordenar los resultados de la misma manera que lo hace Lucene?

Gracias :)

Editar:

simplificado fuerza consulta es el siguiente:

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

¿Puede aclarar con consultas de muestra? – Youssef

+0

http://cakebaker.42dh.com/2008/06/10/order-by-field/ explica de qué trata esta sintaxis específica de MySQL. –

+0

Esto parece una pregunta similar con una respuesta más simple: http://stackoverflow.com/questions/3303851/sqlite-and-custom-order-by – bmaupin

Respuesta

2

Esto es bastante desagradable y torpe, pero debería funcionar. Cree una tabla temporal e inserte la lista ordenada de ID, tal como la devuelve Lucene. Unirse a la tabla que contiene los elementos a la tabla que contiene la lista de los ID de ordenadas:

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; 

Salida:

thing 2 
thing 3 
thing 1 

Sí, es el tipo de SQL que hará que la gente se estremece, pero no lo hacen saber de un SQLite equivalente para ORDER BY FIELD.

+1

Gracias, pero parece un poco demasiado complejo :) Me gustaría más bien hazlo directamente en php ya que la lista es bastante corta (30 elementos como máximo). – DuoSRX

+0

@DuoSRX: Sí, es un poco complejo. Vale la pena probarlo. – Mike

+0

Sí. Bueno, aceptaré tu respuesta de todos modos;) – DuoSRX

Cuestiones relacionadas