2015-07-21 41 views
3

我有两个表:一个项目列表和排序顺序在某些group_id范围。 项目属于一个组或共同(group_id = 0)。SQLite左连接右表中的两个条件

我想用正确的排序顺序查询该组的所有常用组和组项。排序顺序为-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 

就像一个内部联接 - 有没有相应的排序顺序的项目被解雇。

慢查询:

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 

随着〜5.000条目SORT_ORDER和〜1500项的查询需要〜2秒。

我的问题:是否有更好/正确的方法来处理这个问题?

+0

请写出这作为一个答案。 –

回答

0

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

添加一个组合索引为我做的伎俩:

CREATE INDEX sort_order_item_group 
ON sort_order (order_id, group_id); 
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