1

私はオンラインショップをコーディングしています。商品にはデフォルトの価格がありますが、属性 (色、サイズなど) が異なる場合があるため、属性によって価格も異なる場合があります。現在、製品の最低価格と最高価格を見つけるのに役立つ mysql クエリを作成しようとしています。現在、LEFT JOIN を使用すると、クエリの結果が 1 行だけに減少しますが、その理由はわかりません。

SELECT
    products.id AS id,
    categories.name AS category_name,
    MIN(product_attributes.price) AS min_price, MAX(product_attributes.price) AS max_price,
    products.*
FROM products
LEFT JOIN categories ON category_id=categories.id
LEFT JOIN product_attributes ON products.id=product_attributes.product_id

これは正しいアプローチですか?私は mysql についてあまり知りません。ただ試してみるだけで、うまくいけばうれしいです。とにかく助けてくれてありがとう。

4

2 に答える 2

2

現在のクエリには句がありませんがGROUP BY、サブクエリを使用して結果を取得することをお勧めします。

SELECT
    p.id AS id,
    c.name AS category_name,
    pa.min_price, 
    pa.max_price,
    p.*
FROM products p
LEFT JOIN categories c
   ON p.category_id = c.id
LEFT JOIN 
(
    select MIN(product_attributes.price) min_price, 
        MAX(product_attributes.price) max_price, 
        product_id
    from product_attributes
    group by product_id
) pa 
    ON p.id=pa.product_id

サブクエリの使用をお勧めする主な理由は、MySQL MySQL がFULL GROUP BYEXTENSION TO GROUP BYを強制しない動作を許可するa を使用するためです。

MySQL のこの拡張機能により、句または集計関数にSELECTないリスト内の列に予期しない値が返される可能性があります。GROUP BY

MySQL ドキュメントから:

MySQL は GROUP BY の使用を拡張して、選択リストが GROUP BY 句で指定されていない非集計列を参照できるようにします。... この機能を使用して、不要な列の並べ替えやグループ化を回避することで、パフォーマンスを向上させることができます。ただし、これは主に、GROUP BY で指定されていない各非集計列のすべての値が各グループで同じ場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。さらに、各グループからの値の選択は、ORDER BY 句を追加しても影響を受けません。結果セットのソートは値が選択された後に行われ、ORDER BY はサーバーが選択する値には影響しません。

于 2013-03-05T14:12:10.687 に答える
1

GROUP BYあなたは節を持つ必要があります、

SELECT
    products.id AS id,
    categories.name AS category_name,
    MIN(product_attributes.price) AS min_price, 
    MAX(product_attributes.price) AS max_price.
    products.*
FROM products
LEFT JOIN categories ON category_id=categories.id
LEFT JOIN product_attributes ON products.id=product_attributes.product_id
GROUP BY products.id, categories.name

ただし、デフォルトで無効になっているGROUP BY場合、ステートメントは完全に有効であるため、mysql で使用する場合は注意してください。ONLY_FULL_GROUP_BY

クエリを実行する正しい方法は、各製品の最低価格を個別に取得するサブクエリを使用することです。

SELECT  a.id AS id,
        b.name AS category_name,
        c.minPrice, 
        c.maxPrice,
        a.*
FROM    products a
        LEFT JOIN categories b 
            ON a.category_id = b.id
        LEFT JOIN product_attributes c
        (
            SELECT  product_id,
                    MIN(product_attributes.price) minPrice, 
                    MAX(product_attributes.price) maxPrice 
            FROM    product_attributes
            GROUP   BY product_id
        ) d ON a.id = c.product_id
于 2013-03-05T14:12:06.870 に答える