SQLite 左联接,右联接有两个条件 table

SQLite left join with two conditions in right table

我有两个表:项目列表和某些 group_id 范围内的排序顺序。 项目属于一个组或很常见 (group_id=0)。

我想查询该组所有具有正确排序顺序的公共项和组项。必须取消排序顺序为 -1 的所有项目。必须包含没有关联 sort_order 的项目。

错误(幼稚)查询:

SELECT items.* 
FROM   items LEFT JOIN sort_order ON items._id = sort_order.item_id 
WHERE  (items.group_id=0 OR items.group_id=14) 
  AND  sort_order.entity_id=14 
  AND  sort_order.sort >= 0

表现得像内部联接 - 没有对应 sort_order 的项目将被忽略。

慢查询:

SELECT items.* 
FROM   items LEFT JOIN sort_order 
           ON items._id = sort_order.item_id AND sort_order.entity_id=14 
WHERE  (items.group_id=0 OR items.group_id=14) 
  AND  sort_order.sort >= 0

在 sort_order 中有 ~5.000 个条目和 ~1500 个项目,查询需要 ~2 秒。

我的问题:是否有 better/correct 方法来处理这个问题?

可能是废话:

SELECT items.* FROM items WHERE items.id not in (Select id from sort_order)

UNION

SELECT items.* FROM items INNER JOIN sort_order ON items._id = sort_order.item_id AND sort_order.entity_id=14 WHERE (items.group_id=0 OR items.group_id=14) AND sort_order.sort >= 0

找到慢查询的根源:我忘记创建包含 sort_order.item_idsort_order.item_id 的索引。

添加组合索引对我有用:

CREATE INDEX sort_order_item_group 
ON sort_order (order_id, group_id);