GROUP BY と組み合わせて使用される MySQL MIN() で発生している問題に対するより洗練された解決策を探しています。
私は2つのテーブルを持っています:
- 製品 (id、group_id)
- 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;