0

GROUP BY と組み合わせて使用​​される MySQL MIN() で発生している問題に対するより洗練された解決策を探しています。

私は2つのテーブルを持っています:

  1. 製品 (id、group_id)
  2. product_attributes (製品 ID、属性 ID、値)

ある商品グループの各金属グループ(attribute_id=40)の中から最も安い金属を選びたいです。

次のクエリは機能しますが、もっとうまく記述できた可能性があると確信しています。

SELECT metal.product_id, metal.value AS `metal`, `price`.value AS `price`
FROM
    product_attributes metal
INNER JOIN
    (
        SELECT metal.value AS `metal`, MIN(price.value) AS `price`
        FROM 
            product_attributes metal
        LEFT JOIN 
            product_attributes price
        ON metal.product_id = price.product_id
        INNER JOIN products p
        ON p.id = metal.product_id
        WHERE
            metal.attribute_id = 40 AND
            price.attribute_id = 37 AND
            p.group_id = 1
        GROUP BY
            metal.value
        ORDER BY metal ASC, price DESC
    ) AS d ON
    d.metal = metal.value
LEFT JOIN
    product_attributes price ON
    metal.product_id = price.product_id AND price.attribute_id = 37
INNER JOIN
    products p ON
    p.id = metal.product_id
WHERE
    metal.attribute_id = 40
    AND d.price = price.value
    AND p.group_id = 1
GROUP BY
    metal.value
ORDER BY
    metal.value ASC,
    price.value DESC;
4

2 に答える 2

0

解決策は最終的に私よりも簡単でした。内部クエリでデータを価格で並べ替えたので、GROUP BY の前に並べ替えを強制しました。この方法で、必要なもの (各金属グループから最も安い製品) を正確に取得できます。

SELECT * FROM
            (
                SELECT metal.enum_id AS `metal`, metal.product_id FROM product_attributes metal
                LEFT JOIN product_attributes price ON metal.product_id = price.product_id AND price.attribute_id = 37
                INNER JOIN products p ON p.id = metal.product_id
                WHERE
                    metal.attribute_id = 40 AND
                    p.group_id = 1 AND
                    p.id NOT IN (SELECT DISTINCT product_id FROM product_attributes WHERE (attribute_id=162 OR attribute_id=204 OR attribute_id=205) AND `value`=1)
                ORDER BY price.value+'0' ASC 
            ) AS s
            GROUP BY metal
于 2013-04-17T13:08:16.903 に答える