2

私は次のように3つのテーブルを持っています、

1. Link_products_price
DESC: unique_id|product_id|sub_category_id.
2. local_price
DESC: unique_id|price.
3. online_price
DESC: unique_id|price.

特定のproduct_id|sub_category_idの最低価格を選択したいと思います。

私は次のことを思いついた、

アプローチ1:

SELECT MIN(price) 
FROM local_price 
WHERE unique_id IN (SELECT unique_id 
                    FROM link_products_price 
                    WHERE product_id=1 
                    AND sub_category_id=1) 

UNION 

SELECT MIN(price) 
FROM online_price 
WHERE unique_id IN (SELECT unique_id 
                    FROM link_products_price 
                    WHERE product_id=1 
                    AND sub_category_id=1) 
LIMIT 1;

アプローチ2:

これらの3つのテーブルにINNERJOINを使用してビューを作成し、アプリケーションから必要な場合はビューからMIN(価格)をクエリします。

ただし、その後、viewは実行時にのみクエリを実行します。

アプローチ1のクエリが問題ないかどうか、またはさらに最適化できるかどうかと、VIEWアプローチに関するアドバイスを教えてください。

4

2 に答える 2

3

最初のアプローチでは、常に現地価格のORDER BY最小値が選択されますLIMITただし、クエリを結合し、MySQL のLEAST()関数をMIN()集計と組み合わせて使用​​する方が簡単です。

SELECT LEAST(MIN(local_price.price), MIN(online_price.price))
FROM   link_products_price
  LEFT JOIN  local_price USING (unique_id)
  LEFT JOIN online_price USING (unique_id)
WHERE link_products_price.product_id = 1
  AND link_products_price.sub_category_id = 1
于 2012-06-03T07:42:36.013 に答える
2

効率(読みやすさではない)の観点からは、おそらく最初の例に似たものを使用しますが、例にエラーが含まれていることを除いて-UNIONが結果をソートすると仮定しますか?

代わりに、この修正版を試してください。

SELECT LEAST(

    (SELECT MIN(price) 
     FROM local_price 
     WHERE unique_id IN (SELECT unique_id 
                         FROM link_products_price 
                         WHERE product_id=1 
                         AND sub_category_id=1))
    ,
    (SELECT MIN(price) 
     FROM online_price 
     WHERE unique_id IN (SELECT unique_id 
                         FROM link_products_price 
                         WHERE product_id=1 
                         AND sub_category_id=1))
)

しかし、何億もの行がない限り、効率の悪い方法を使用したとしても、クエリが非常に高速であるため、どれが最速であるかは問題ではないことに気付くでしょう。

効率を得るために最も重要なことは、適切なインデックスがあることを確認することです。

次のインデックスを追加することをお勧めします。

  • link_products_price (product_id、sub_category_id)
  • local_price (unique_id , price)
  • online_price (unique_id , price)
于 2012-06-03T07:48:24.363 に答える