【问题标题】:Order by field with SQLite使用 SQLite 按字段排序
【发布时间】:2023-03-04 19:29:01
【问题描述】:

我实际上正在从事一个 Symfony 项目,我们正在使用 Lucene 作为我们的搜索引擎。 我试图使用 SQLite 内存数据库进行单元测试(我们使用的是 MySQL),但我偶然发现了一些东西。

项目的搜索引擎部分使用 Lucene 索引。基本上,您查询它并获得一个有序的 id 列表,您可以使用 Where In() 子句查询您的数据库。 问题是查询中有一个 ORDER BY Field(id, ...) 子句,它按照与 Lucene 返回的结果相同的顺序对结果进行排序。

有没有使用 SQLite 的 ORDER BY Field 的替代方法?还是有另一种方法可以像 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)

【问题讨论】:

标签: mysql sqlite lucene


【解决方案1】:

这是相当讨厌和笨重,但它应该工作。创建一个临时表,并插入 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 等价物。

【讨论】:

  • 谢谢,但它似乎有点过于复杂:) 我宁愿直接在 php 中做,因为列表很短(最多 30 项)。
  • @DuoSRX:是的,它有点过于复杂。不过值得一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多