0

我有一个看起来像这样的表:

| 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,它很快。

4

2 回答 2

0

如果您的查询来自您公开内容的表,则该行:

and i.id not in (select li.returned_product_id  

会查看表格的 id 而不是产品的 id,对吗?

那应该是

and i.product_id not in (select li.returned_product_id  
于 2012-05-09T21:13:31.283 回答
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

?

于 2012-05-09T21:29:25.887 回答