2010-06-22 3 views
5

저는 실제로 직장에서 Symfony 프로젝트를 작업 중이며 검색 엔진에 Lucene을 사용하고 있습니다. 단위 테스트를 위해 SQLite 메모리 내장 데이터베이스를 사용하려고했지만 (우리는 MySQL을 사용하고 있습니다) 무언가를 발견했습니다.SQLite로 필드 정렬

프로젝트의 검색 엔진 부분은 Lucene 색인을 사용합니다. 기본적으로이를 쿼리하면 ID In List()를 사용하여 Where In() 절을 사용하여 데이터베이스를 쿼리 할 수 ​​있습니다. 문제는 쿼리에 ORDER BY Field (id, ...) 절이있어서 Lucene에서 반환 한 결과와 동일한 순서로 결과를 정렬하는 것입니다.

SQLite를 사용하는 ORDER BY 필드 대신 사용할 수있는 옵션이 있습니까? 아니면 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) 
+0

샘플 검색어를 사용하여 명확하게 설명해 주실 수 있습니까? – Youssef

+0

http://cakebaker.42dh.com/2008/06/10/order-by-field/는이 MySQL 관련 구문에 대해 설명합니다. –

+0

이것은 간단한 질문과 비슷합니다. http://stackoverflow.com/questions/3303851/sqlite-and-custom-order-by – bmaupin

답변

2

이 매우 불쾌하고 투박하지만, 그것은 작동합니다. 임시 테이블을 만들고 Lucene에서 반환 한 ID의 정렬 된 목록을 삽입하십시오. 주문 ID의 목록이 포함 된 테이블에 항목이 포함 된 테이블을 가입 :

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의 종류는하지만 그렇게하지 ORDER BY FIELD에 해당하는 SQLite를 알고 있어야합니다.

+1

감사하지만 조금 복잡해 보이지만 :) 오히려 목록에서 꽤 짧은 (30 항목 최대)로 직접 PHP에서 할. – DuoSRX

+0

@DuoSRX : 그래, 조금 복잡해. 가치가있는 시도. – Mike

+0

예. 어쨌든 당신의 대답을 받아 들일 것입니다.) – DuoSRX