SQLite中使用字段排序

5
我正在工作中处理一个Symfony项目,并且我们正在使用Lucene作为搜索引擎。我试图在单元测试中使用SQLite内存数据库(我们正在使用MySQL),但是我遇到了一些问题。
该项目的搜索引擎部分使用Lucene索引。基本上,您可以查询它并获得一个有序的ID列表,然后您可以使用Where In()子句查询您的数据库。问题在于查询中有一个ORDER BY Field(id, ...)子句,它按与Lucene返回结果相同的顺序排序结果。
是否有任何替代ORDER BY Field的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)

你能否提供一些查询示例以便澄清? - Youssef
http://cakebaker.42dh.com/2008/06/10/order-by-field/ 解释了这个特定于MySQL的语法是什么。 - Donal Fellows
这看起来是一个类似的问题,答案更简单: https://dev59.com/pXA75IYBdhLWcg3wboYz - bmaupin
1个回答

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语句可能会让人感到不安,但我不知道是否有SQLite等效的ORDER BY FIELD


1
谢谢,但这似乎有点过于复杂了 :) 我宁愿直接在 PHP 中完成,因为列表相当短(最多30个项目)。 - DuoSRX
@DuoSRX:是的,它有点过于复杂了。不过还是值得一试的。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接