2010-06-22 25 views
5

Aslında işte Symfony projesi üzerinde çalışıyorum ve arama motorumuz için Lucene kullanıyoruz. Birim testleri için SQLite bellek veritabanını kullanmaya çalışıyordum (MySQL kullanıyoruz) ama ben bir şeye tökezledim.SQLite ile alana göre

Projenin arama motoru kısmı Lucene indekslemeyi kullanır. Temel olarak, onu sorgularsınız ve veritabanınızı Where In() deyimiyle sorgulamak için kullanabileceğiniz düzenli bir kimlik listesi alırsınız. Sorun, sorunda Lucene tarafından döndürülen sonuçlarla aynı sırayla sonuçlanan bir ORDER BY Alanı (id, ...) yan tümcesi var.

SQLite kullanarak ORDER BY Field uygulamasına alternatif var mı? Veya sonuçları Lucene'nin yaptığı gibi sıralamak için başka bir yol var mı?

Teşekkür :)

Düzenleme:

Basitleştirilmiş sorgu kudreti şuna benzer:

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

Örnek sorgularla netleştirebilir misiniz? – Youssef

+0

http://cakebaker.42dh.com/2008/06/10/order-by-field/ bu MySQL'e özgü sözdiziminin neyle ilgili olduğunu açıklar. –

+0

Bu daha basit bir yanıtla benzer bir soruya benziyor: http://stackoverflow.com/questions/3303851/sqlite-and-custom-order-by – bmaupin

cevap

2

Bu oldukça kötü ve aksak, ama çalışması gerekir. Geçici bir tablo oluşturun ve Lucene tarafından döndürülen sıralı kimlik listesini ekleyin. sipariş kimlikleri listesini içeren tabloya öğeleri içeren tabloyu Üyelik:

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; 

Çıktı:

thing 2 
thing 3 
thing 1 

Evet, insanlar ürperti yapacak SQL sıralama öyle, ama yok ORDER BY FIELD için bir SQLite eşdeğerini biliyorum.

+1

Teşekkürler ama biraz fazla karmaşık görünüyor :) liste oldukça kısa olduğu için bunu doğrudan php'de yapın (maks. 30 öğe). – DuoSRX

+0

@DuoSRX: Evet, biraz karmaşık. Yine de denemeye değer. – Mike

+0

Evet. Peki cevabınızı yine de kabul ediyorum;) – DuoSRX