簡體   English   中英

如何從多對多mysql關系中選擇唯一值

[英]How to select unique value from many to many mysql relationship

嗨,我在這個 sql 案例中感到困惑。 我正在使用mysql Ver 15.1 Distrib 10.2.31-MariaDB 假設我有 3 個表productscategoriesproduct_categories作為數據透視表。

以下是數據示例:

products:

|    id    |   name    |
------------------------
| 1        | asd wef   |
| 2        | gggg2222  |
| 3        | pppga 99  |
| 4        | lalala 55 |

對於類別:

| id | level | parent_id | name     |
-----------------------------------
| 20 | 1     |           | Fashion  |
| 22 | 2     | 20        | Top      |
| 23 | 3     | 22        | T-Shirt  |
| 24 | 3     | 22        | Jacket   |

對於數據透視表,product_categories:

|  product_id  |  category_id  |
--------------------------------
| 1            | 20            |
| 1            | 22            |
| 1            | 23            |
| 2            | 22            |
| 2            | 20            |
| 3            | 20            |
| 4            | 20            |

因此,從數據透視表中可以看出,只有product_id = 3 & 4停止在類別級別 1 中。而product_id = 2僅停止在類別級別 2 中。

我想在這里實現的是當我從categories表中選擇時。 我可以數出有多少產品停在這里。 這是我想要獲取的數據示例。


"categories": [
    {
        "id": 20,
        "total_product": 4
        "stopped_product": 2
    },
    {
        "id": 22,
        "total_product": 3
        "stopped_product": 1
    }
]

到目前為止,我嘗試使用group by

SELECT * FROM product_categories WHERE product_id IN (1, 2, 3, 4) GROUP BY product_id HAVING category_id=20

輸出:

|  product_id  |  category_id  |
--------------------------------
| 1            | 20            |
| 3            | 20            |
| 4            | 20            |

預期產出

|  product_id  |  category_id  |
--------------------------------
| 3            | 20            |
| 4            | 20            |

我猜你只想要最大值

    SELECT product_id,MAX(category_id) as category_id FROM product_categories WHERE product_id IN (1, 2, 
    3, 4) 
    GROUP BY product_id 
    HAVING category_id=20

您可以使用 CTE 為每個產品生成停止類別列表,然后將其JOIN categoriesproduct_categories表以計算每個類別的產品總數和停止產品數量:

WITH prods AS (
  SELECT product_id, MAX(category_id) AS stop_cat
  FROM product_categories
  GROUP BY product_id
)
SELECT c.id AS category_id, 
       COUNT(DISTINCT pc.product_id) AS total_product,
       SUM(c.id = p.stop_cat) AS stopped_product
FROM categories c
JOIN product_categories pc ON pc.category_id = c.id
JOIN prods p ON p.product_id = pc.product_id
GROUP BY c.id

輸出(對於您的樣本數據)

category_id     total_product   stopped_product
20              4               2
22              2               1
23              1               1

dbfiddle 上的演示

您可以在此處找到按類別分類的產品數量和 ID:

SELECT c.name as categoryName, c.level, COUNT(pc.product_id) as productCount, GROUP_CONCAT(pc.product_id) as productIds 
FROM product_categories pc JOIN categories c ON c.id = pc.category_id 
WHERE 1 
GROUP by c.id

暫無
暫無

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

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