SQLite左连接右表中的两个条件
问题描述:
我有两个表:一个项目列表和排序顺序在某些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秒。
我的问题:是否有更好/正确的方法来处理这个问题?
答
找到慢查询的源:我忘了创建含有sort_order.item_id
和sort_order.item_id
的索引。
添加一个组合索引为我做的伎俩:
CREATE INDEX sort_order_item_group
ON sort_order (order_id, group_id);
答
也许无义:
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
请写出这作为一个答案。 –