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 で新しい項目が作成されます。各商品1点ずつあり、返品された商品を再度購入し、再度返品することが可能です。

特定の条件下で、テーブル データを他のテーブルのデータと結合しています。最後の条件として、最初に返品された項目を除外しようとしています。これは、次のように、これまでに購入し、返されていないすべての 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 と return_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 に答える