SQLite 左联接,右联接有两个条件 table
SQLite left join with two conditions in right table
我有两个表:项目列表和某些 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 中有 ~5.000 个条目和 ~1500 个项目,查询需要 ~2 秒。
我的问题:是否有 better/correct 方法来处理这个问题?
可能是废话:
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
找到慢查询的根源:我忘记创建包含 sort_order.item_id
和 sort_order.item_id
的索引。
添加组合索引对我有用:
CREATE INDEX sort_order_item_group
ON sort_order (order_id, group_id);
我有两个表:项目列表和某些 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 中有 ~5.000 个条目和 ~1500 个项目,查询需要 ~2 秒。
我的问题:是否有 better/correct 方法来处理这个问题?
可能是废话:
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
找到慢查询的根源:我忘记创建包含 sort_order.item_id
和 sort_order.item_id
的索引。
添加组合索引对我有用:
CREATE INDEX sort_order_item_group
ON sort_order (order_id, group_id);