我有一个看起来像这样的表:
| id | order_id | product_id | category_id |name | cost | returned_product_id |
| 3100 | 900 | 0125 | 3 | Foo | 14 | NULL |
| 3101 | 901 | 0145 | 3 | Bar | 10 | NULL |
| 3102 | 901 | 2122 | 3 | Baz | 11 | NULL |
| 3103 | 900 | 0125 | 3 | Foo | -14 | 3100 |
| 3104 | 902 | 0125 | 3 | Foo | 14 | NULL |
| 3105 | 902 | 0125 | 3 | Foo | -14 | 3104 |
| 3106 | 903 | 0125 | 3 | Foo | 14 | NULL |
id 是包含 product_id 的订单的单个行项目。如果产品被退回,则会创建一个带有新 ID 的新订单项。每个产品都有一个,可以再次回购退回的物品,然后再次退货。
在特定条件下,我将表数据与其他表中的数据连接起来。作为最后一个条件,我试图排除任何最初退回的订单项。这是为了尝试执行一个查询,该查询基本上为我提供了所有已购买且尚未返回的 product_id,如下所示:
select product_id
from orders o,
line_items i
where o.state = 'paid'
and o.id = i.order_id
and i.category_id = 3
and i.product_id not in (select li.returned_product_id
from line_items li
where li.refunded_product_id is not null
and li.product_id = 3)
即使我在 id 和 returned_product_id 上都有索引,但上面的查询确实很慢(数千行),如果我的子选择查询 id,它很快。