2

次のようなユーザーを含むテーブルがあります。

user_id | status
----------------
1       | 1
2       | 2
3       | 1
4       | 1

注文を含むテーブル

order_id | user_id | status
---------------------------
1        | 1       | 1
2        | 2       | 1
3        | 2       | 2
4        | 2       | 1
5        | 3       | 1

および注文商品を含むテーブル

order_id | cash
----------------
1        | 10
1        | 20
1        | 10
2        | 10
3        | 10
3        | 10

選択する必要があるのは、status=1 で注文が 1 つだけあるすべてのユーザーで、その注文は status=1 で、その注文のすべての製品の合計が >=30 である必要があります。

したがって、上記のデータクエリでは、id=1 のユーザーのみを返す必要があります

私はselectプロシージャを書くことができましたが、それは速く動作していません:

SELECT user_id
FROM   users US
WHERE  status = 1
       AND (SELECT Count(*)
            FROM   orders ORD
            WHERE  ORD.user_id = US.user_id) = 1
       AND (SELECT Count(*)
            FROM   orders ORD
            WHERE  ORD.user_id = US.user_id
                   AND ORD.status = 1) = 1
       AND (SELECT Sum(PRO.cash)
            FROM   products PRO
                   JOIN orders ORD
                     ON PRO.order_id = ORD.order_id
            WHERE  ORD.user_id = US.user_id) > 30  

これを少し改善して、内部選択をあまり使用する必要がないようにしたいと思います

4

2 に答える 2

4

通常、クエリをwhere句からjoins次のように移動すると、パフォーマンスが向上します。

select  u.user_id
from    Users u
join    Orders o
on      o.user_id = u.user_id
join    Producs p
on      p.order_id = o.order_id
group by
        u.user_id
having  min(u.status) = 1 -- there's only 1 user, so min() is safe
        and count(distinct o.order_id) = 1
        and min(o.status) = 1 -- there's only 1 order, so min() is safe
        and sum(p.cash) > 30
于 2012-12-05T13:20:04.813 に答える
0
SELECT USER_ID
  FROM (SELECT US.USER_ID, SUM (PRO.CASH) CASH
          FROM USERS US, ORDERS ORD, PRODUCTS PRO
         WHERE US.USER_ID = ORD.USER_ID AND ORD.ORDER_ID = PRO.ORDER_ID AND US.STATUS = 1 AND ORD.STATUS = 1)
 WHERE CASH > 30
于 2012-12-05T13:18:02.260 に答える