根据您在"mysql join group min"或"mysql join group max"找到的所有其他问题,使用GROUP BY和MIN / MAX和JOIN时会有一些问题。您可以使用以下方法:
选择(仅)给定产品的变体的最低价格。
选择找到的变体的剩余信息。
选择找到的变体的产品信息。
对于第1步,查询将如下所示:
SELECT
product_id,
MIN(price) as price
FROM
product_variants
GROUP BY
product_id
这将导致以下输出(ID可能不同):
+------------+-------+
| product_id | price |
+------------+-------+
| 1 | 50 |
| 2 | 200 |
| 4 | 200 |
+------------+-------+
对于第2步,我们在自身的JOIN查询中使用此结果:
SELECT
v2.product_id,
v2.packet_size,
v2.price
FROM
product_variants v2
JOIN
(SELECT -- here is your first query
product_id,
MIN(price) as price
FROM
product_variants
GROUP BY
product_id
) v1 -- notice the "v1" alias here, its needed
USING (product_id, price)
结果将是:
+------------+-------------+-------+
| product_id | packet_size | price |
+------------+-------------+-------+
| 1 | 100 ML | 50 |
| 2 | 200 L | 200 |
| 4 | 200 L | 200 |
+------------+-------------+-------+
对于第3步,它只是两个表之间的“正常”连接:
SELECT
p.id,
p.product_name,
p.photo,
v3.packet_size,
v3.price
FROM
products p
JOIN
(SELECT -- here is query 2
v2.product_id,
v2.packet_size,
v2.price
FROM
product_variants v2
JOIN
(SELECT -- here is query 1
product_id,
MIN(price) as price
FROM
product_variants
GROUP BY product_id
) v1
USING (product_id, price)
) v3
ON
p.id = v3.product_id;
这将得到以下结果(再次ID可能不同):
+----+--------------+-------+-------------+-------+
| id | product_name | photo | packet_size | price |
+----+--------------+-------+-------------+-------+
| 1 | product_1 | 1.png | 100 ML | 50 |
| 2 | product_2 | 2.png | 200 L | 200 |
| 4 | product_3 | 3.png | 200 L | 200 |
+----+--------------+-------+-------------+-------+
如果您使用LEFT JOIN而不是“普通”JOIN,那么您也可以获得没有任何变体的产品:
+----+--------------+-------+-------------+-------+
| id | product_name | photo | packet_size | price |
+----+--------------+-------+-------------+-------+
| 1 | product_1 | 1.png | 100 ML | 50 |
| 2 | product_2 | 2.png | 200 L | 200 |
| 4 | product_3 | 3.png | 200 L | 200 |
| 5 | product_4 | 4.png | NULL | NULL |
+----+--------------+-------+-------------+-------+
最大的问题是获取找到的变体的剩余信息。您不能在一个查询中执行此操作,因为组函数将获取正确的值,但GROUP BY之后的其他列值将不是来自找到的组函数值,而是很可能来自组中的第一行。