MySQL:排除其中id出现在表的两个单独列中的行

时间:2012-05-09 21:05:12

标签: mysql

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

| 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,那就快了。

2 个答案:

答案 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