4

私はこのクエリに取り組んできました、そしてそれは私を狂わせています。

商品テーブルとサブ商品のテーブルがあります。つまり、商品データとサブ商品の最低(割引)価格でビューを作成したいと思います。(いくつかのサブ製品(色/サイズ)などのシャツについて考えてみてください)

次に、このクエリをVIEWで使用したいのですが、この部分が気になります。

私が今持っているクエリ:

  SELECT m.* from product_items m join
  (select product_id, min(price_discount) md 
       from product_items group by product_id) mm
  on m.product_id=mm.product_id and m.price_discount=md

このクエリは機能しており、良い結果が得られます。しかし今、私はビュー(vw_product_lowest)を作成したいと思います。そして、エラー:ERROR 1349 (HY000): View's SELECT contains a subquery in the FROM clause

誰かがそのクエリを互換性のあるVIEWクエリに変換するのを手伝ってもらえますか?ありがとう!

4

2 に答える 2

9

いくつかのオプションがあります。

  1. サブクエリをビューに配置します(結果のビューには後続の結合を実行するためのインデックスがないため、遅くなる可能性があります)。

    CREATE VIEW mm AS
      SELECT   product_id, MIN(price_discount) price_discount
      FROM     product_items
      GROUP BY product_id
    ;
    
    CREATE VIEW my_view AS
      SELECT * FROM product_items m NATURAL JOIN mm
    ;
    
  2. 相関サブクエリを使用します(サブクエリはテーブル内のすべてのレコードに対して評価する必要があるため、遅くなる可能性があります。最高のパフォーマンスは、の複合インデックスで達成されます(product_id, price_discount)):

    CREATE VIEW my_view AS
      SELECT * FROM product_items m WHERE price_discount = (
        SELECT MIN(mm.price_discount)
        FROM   product_items mm
        WHERE  mm.product_id = m.product_id
      )
    ;
    
  3. 戦略を使用しEXISTSて相関サブクエリを最適化します(の複合インデックスからもメリットがあります(product_id, price_discount))。

    CREATE VIEW my_view AS
      SELECT * FROM product_items m WHERE NOT EXISTS (
        SELECT 1
        FROM   product_items mm
        WHERE  mm.product_id     = m.product_id
           AND mm.price_discount < m.price_discount
        LIMIT  1
      )
    ;
    
于 2013-03-09T12:05:29.250 に答える
6

マニュアルによると、VIEWサブクエリを含めることはできません。本当にクエリで を作成したい場合はVIEW、サブクエリ用に別のビューを作成する必要があります。

最初のビュー

CREATE VIEW MinimumPrice
AS 
SELECT  product_id, MIN(price_discount) md 
FROM    product_items 
GROUP   BY product_id

セカンドビュー

CREATE VIEW MinimumPriceList
AS 
SELECT  m.* 
FROM    product_items m 
        INNER JOIN MinimumPrice mm 
            ON  m.product_id = mm.product_id AND 
                m.price_discount = mm.md

MAIN VIEW を照会するには、

SELECT * FROM MinimumPriceList

ビュー定義には次の制限があります。FROM MySQL MANUAL

  • SELECT ステートメントの FROM 句にサブクエリを含めることはできません。
  • SELECT ステートメントは、システム変数またはユーザー変数を参照できません。
  • ストアド プログラム内では、定義はプログラム パラメータまたはローカル変数を参照できません。
  • ....
于 2013-03-09T11:52:00.797 に答える