SQLite在右表中保留了两个条件的连接

时间:2015-07-21 22:03:24

标签: sqlite left-join

我有两个表:一个项目列表和一些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和~1500项中有大约5.000个条目,查询需要大约2秒。

我的问题:有没有更好/更正确的方法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

也许是胡说八道:

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

答案 1 :(得分:0)

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

添加组合索引对我来说很有用:

CREATE INDEX sort_order_item_group 
ON sort_order (order_id, group_id);