1

私はそのようなテーブルを持っています:

order_id INT product_id INT average_price DOUBLE other_price DOUBLE

product_ids注文ごとorder_idに複数の製品、つまり複数の製品があります。注文あたりの最低平均価格の商品と、これらの商品のうち、の商品を希望しother_price >= average_priceます。

私はこれを試しました:

SELECT a.order_id, a.product_id, a.average_price, a.other_price
FROM
    (SELECT order_id, product_id, min(average_price) as average_price
     FROM orders
     GROUP BY order_id
    ) as min_priced_product_per_order
JOIN orders AS a ON a.order_id = min_priced_product_per_order.order_id and min_priced_product_per_order.product_id = min_priced_product_per_order.product_id 
WHERE a.other_price >= a.average_price

しかし、結果は私が期待したものではなく、product_id各注文の最低平均価格で得られているとは確信していません(DBを調べて確認しました)。

より良いクエリを提案できますか?

乾杯。

ピート

4

1 に答える 1

0

問題の鍵は、product_idがグループ化や集計関数なしで緩んでいることです(このクエリはほとんどのRDMSでは実行されません)。

(SELECT order_id, product_id, min(average_price) as average_price
     FROM orders
     GROUP BY order_id
) as min_priced_product_per_order

これは、MySQLが作成した優れた拡張機能であり、これまでサポートされていなかったサブクエリを必要とする特定の結合を回避します。product_idは任意に選択されています。つまり、特別な理由なしに最初に見つかった行は何でもです。これは確かに(偶然にそうなる可能性がありますが)特定のproduct_idを探している場合に望む結果を返すことはありません。http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

問題のあるID(product_id)を内部クエリの集計から削除し、この場合は外部クエリのmin(average_price)と結合して、IDを見つけることで、これらの種類のクエリをいつでも作成できます。

(SELECT min_order.order_id, product_id, min_order.average_price
FROM
(SELECT order_id, min(average_price) as average_price
     FROM orders
     GROUP BY order_id
 ) AS min_order
 JOIN orders on 
    min_order.product_id = order.product_id
    AND min_order.average_price = order.average_price

注:同点の場合、これはすべての最小のaverage_priceproduct_idを返します。私にはどちらが正しいように思われますか。そうでなければ、SQLが想定しているものではない、ある製品を他の製品から任意に選択するだけです。ただし、上記のクエリに別の集計をラップして結果を再度フィルタリングし、最小または最大の商品IDを選択して、注文ごとに1つの結果のみが取得されるようにすることができます。

于 2011-03-24T23:41:07.547 に答える