我有两个表:一个项目列表和一些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秒。
我的问题:有没有更好/更正确的方法来解决这个问题?
答案 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_id
和sort_order.item_id
的索引。
添加组合索引对我来说很有用:
CREATE INDEX sort_order_item_group
ON sort_order (order_id, group_id);