gpt4 book ai didi

mysql - 如何从一个表中获取所有产品并合并另一个包含多行的表中的一行?

转载 作者:行者123 更新时间:2023-11-29 10:27:24 25 4
gpt4 key购买 nike

我必须要 table 。 products 表和 product_variants 表。在产品表中,我有

id、产品名称、照片

product_variants表中,我有

id、product_id、packet_size、价格

我必须先添加产品,然后再添加变体。可能没有为此添加任何变体。

我想从变体表中以最低的价格获取具有一种变体详细信息的所有产品。

示例场景:

产品表

id    product_name     photo
1 product_1 1.png
2 product_2 2.png
3 product_3 3.png
4 product_4 4.png

产品变体

id     product_id      packet_size    price
1 1 100 ML 50 RS.
2 1 200 ML 100 Rs.
3 1 300 ML 150 RS.
4 2 300 L 300 Rs.
5 2 200 L 200 Rs.
6 3 200 K 200 Rs.

我希望结果如下:

1     product_1        1.png     100 ML         50 RS.
2 product_2 2.png 200 L 200 Rs.
3 product_3 3.png 200 K 200 Rs.

谢谢。

最佳答案

基于您可以找到的所有其他问题 "mysql join group min""mysql join group max"使用 GROUP BY、MIN/MAX 和 JOIN 时存在一些问题。您可以使用以下方法:

  1. (仅)选择给定产品的变体的最低价格。
  2. 选择找到的变体的剩余信息。
  3. 选择找到的型号的产品信息。

对于第 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 步,它只是两个表之间的“正常”JOIN:

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 之后的其他列值不会来自找到的组函数值,而很可能来自组中的第一行。

关于mysql - 如何从一个表中获取所有产品并合并另一个包含多行的表中的一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48048452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com