sql >> データベース >  >> RDS >> Mysql

サブクエリを相互にネストすることにより、MySQLの61テーブルのJOIN制限を回避します

    EAVデザインを介してあまりにも多くの属性を結合すると、結合の制限を超える可能性があります。それ以前でも、非常に多くの結合のコストが幾何学的に高くなるため、結合にはおそらく実際的な制限があります。これがどれほど悪いかはサーバーの容量によって異なりますが、61よりかなり低い可能性があります。

    そのため、EAVデータモデルをクエリして、従来のリレーショナルモデル(属性ごとに1列)に格納されているかのように結果を生成するのは問題があります。

    解決策:属性ごとの結合でそれを行わないでください。つまり、純粋にSQLを使用して従来のエンティティごとの行形式で結果を生成することは期待できません。

    私はMagentoスキーマに精通していませんが、クエリから次のようなものが機能する可能性があると推測できます:

    SELECT cpe.entity_id
    , o.value AS option
    , v.value AS option_value
    FROM catalog_product_entity AS cpe
    INNER JOIN catalog_product_entity_int AS i 
      ON cpe.entity_id = i.entity_id AND i.attribute_id IN (2,3,4)
    INNER JOIN eav_attribute_option AS o 
      ON i.value = o.option_id AND i.attribute_id = o.attribute_id
    INNER JOIN eav_attribute_option_value AS v
      ON v.option_id = o.option_id;
    

    IN(2,3,4,...) 述語は、複数の属性を指定する場所です。より多くの属性を取得するために、さらに結合を追加する必要はありません。列ではなく行として返されるだけです。

    これは、この結果セットのすべての行をフェッチして、それらを単一のオブジェクトのフィールドにマップするアプリケーションコードを作成する必要があることを意味します。

    @Axelのコメントによると、Magentoは、結果セットを消費してオブジェクトにマッピングするためのヘルパー関数を提供しているようです。




    1. SQL ServerExpress用のSQLServerプロファイラーはありますか?

    2. MySQLで今日以上の日時

    3. MySQLクエリからフィールドタイプを返す方法は?

    4. ID列を含むSqlBulkCopy挿入