我有一个看起来像这样的表:
| 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_ids,如下所示:
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上都有索引,上面的查询也很慢(数千行),如果我的subselect查询了id,那就快了。
答案 0 :(得分:0)
如果您的查询来自您公开内容的表格,则为以下行:
and i.id not in (select li.returned_product_id
会查看表的id而不是产品的id,wright?
那应该是
and i.product_id not in (select li.returned_product_id
答案 1 :(得分:0)
类似的东西:
select distinct i.product_id from
line_items i left join line_items j
on i.product_id = j.refunded_product_id
where j.refunded_product_id is null