簡體   English   中英

如何從一個表中獲取所有產品,並從包含多行的另一張表中合並一行?

[英]How to fetch all the products from one table and merge one row from another table which contain multiple rows?

我要桌子。 products表和product_variants表。 product table ,我有

id, product_name, photo

product_variants表中,我有

id, product_id, packet_size, price

我必須先添加產品,然后再添加變體。 可能沒有為此添加任何變體。

我想以最低的價格從變量表中獲取所有帶有一個變量詳細信息的產品。

示例方案:

產品表

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

product_variants

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

這將導致以下輸出(標識可能不同):

+------------+-------+
| 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之后的其他列值將不是來自找到的組函數值,而是很有可能來自組的第一行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM