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

Mysql 如何从一个表中获取所有产品,并从包含多行的另一个表中合并一行?,mysql,Mysql,我必须坐在桌子上产品表和产品_变体表。 在产品表中,我有 标识、产品名称、照片 在product\u variants表中,我有 id、产品id、包装大小、价格 我必须先添加产品,然后再添加变体。可能没有为此添加任何变体 我想从变体表中以最低价格获取所有具有一个变体详细信息的产品 示例场景: 产品表 id product_name photo 1 product_1 1.png 2 product_2 2.png 3 produc

我必须坐在桌子上<代码>产品表和
产品_变体
表。 在
产品表中
,我有

标识、产品名称、照片

product\u variants
表中,我有

id、产品id、包装大小、价格

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

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

示例场景:

产品表

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.

谢谢。

基于您可以找到的所有其他问题,或者在使用GROUP BY和MIN/MAX and JOINs时有一些问题。您可以使用以下方法:

  • 选择(仅)给定产品变体的最低价格
  • 选择找到的变体的剩余信息
  • 选择找到的变体的产品信息
  • 对于步骤1,查询将如下所示:

    SELECT
        product_id,
        MIN(price) as price
    FROM
        product_variants
    GROUP BY
        product_id
    
    这将导致以下输出(ID可能不同):

    对于步骤2,我们在自身的联接查询中使用此结果:

    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 |
    |  5 | product_4    | 4.png | NULL        |  NULL |
    +----+--------------+-------+-------------+-------+
    

    最大的问题是获取已发现变体的剩余信息。不能在一个查询中执行此操作,因为group函数将获取正确的值,但group BY后面的其他列值将不会来自找到的group函数值,而很可能来自组中的第一行。

    请在格式设置上稍加努力。你试过什么了吗?小费。将单位与价值分开存放。谢谢@草莓。但这只是一个例子。在我的项目中,我已将它们分开。请修改您的示例
    +----+--------------+-------+-------------+-------+
    | 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 |
    +----+--------------+-------+-------------+-------+
    
    +----+--------------+-------+-------------+-------+
    | 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 |
    +----+--------------+-------+-------------+-------+