2015-07-21 73 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