2010-06-22 132 views
5

我實際上正在開發一個Symfony項目,我們正在使用Lucene作爲我們的搜索引擎。 我試圖使用SQLite內存數據庫進行單元測試(我們正在使用MySQL),但是我偶然發現了一些東西。按字段與SQLite排序

該項目的搜索引擎部分使用Lucene索引。基本上,您可以查詢它並獲得有序的ID列表,您可以使用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) 
+0

請問您能否通過樣品查詢澄清? – Youssef 2010-06-22 09:33:13

+0

http://cakebaker.42dh.com/2008/06/10/order-by-field/解釋了這個MySQL特有的語法是關於什麼的。 – 2010-06-22 10:08:50

+0

這看起來像一個類似的問題與更簡單的答案: http://stackoverflow.com/questions/3303851/sqlite-and-custom-order-by – bmaupin 2011-08-11 20:28:20

回答

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

謝謝,但它似乎有點過於複雜:)我會而是直接在php中做,因爲列表非常短(最多30項)。 – DuoSRX 2010-06-28 14:30:14

+0

@DooSRX:是的,它有點過於複雜。值得一試雖然。 – Mike 2010-06-28 15:03:20

+0

是的。那麼我會接受你的答案;) – DuoSRX 2010-06-28 19:11:00