簡體   English   中英

SQL - 獲取具有一個結果和選定選項的行 - 關系表

[英]SQL - Get rows with one result and selected option - Relation Table

我有一張表,其中包含產品和顏色的關系。 每個產品都有一種或多種顏色。 是否可以執行僅返回只有一種顏色和所需顏色的產品的查詢?

來自 api 的值: color_slug = white ;

示例表:

color_table
+----------+------------+
| color_id | color_slug |
+----------+------------+
|        1 | white      |
|        2 | blue       |
|        3 | black      |
|        4 | green      |
|        5 | red        |
|        6 | yellow     |
+----------+------------+
product_table
+------------+--------------+
| product_id | product_name |
+------------+--------------+
|          1 | shoes        |
|          2 | shorts       |
|          3 | t-shirt      |
|          4 | jacket       |
|          5 | watch        |
|          6 | glasses      |
+------------+--------------+
pc_relation
+----+------------+----------+
| id | product_id | color_id |
+----+------------+----------+
|  1 |          1 |        5 |
|  2 |          1 |        1 |
|  3 |          2 |        1 |
|  4 |          2 |        4 |
|  5 |          2 |        3 |
|  6 |          3 |        2 |
|  7 |          4 |        1 |
|  8 |          5 |        5 |
|  9 |          5 |        6 |
| 10 |          6 |        1 |
+----+------------+----------+

選擇獨特的顏色值(如果我把 WHERE color_id = 1 產品顏色不再是一種顏色):

SELECT product_id 
FROM pc_relation
// WHERE color_id = 1
GROUP BY product_id 
HAVING MIN(color_id) = MAX(color_id)

pc_relation.id = 6,7,10

SELECT *
FROM color_table
INNER JOIN pc_relation ON pc_relation.color_id = color_table.color_id 
INNER JOIN product_table ON pc_relation.product_id  = product_table.product_id
WHERE colors.color_slug = 'white'

想要的值(color_slug = white):

pc_relation.id = 7,10 product_table.product_name = jacket, glasses

*所有組合都是唯一的並已編入索引。 例如,我不能有兩次相同顏色的產品。

您的第一個查詢是在正確的軌道上。 將顏色比較移至HAVING子句:

SELECT product_id 
FROM pc_relation
GROUP BY product_id 
HAVING MIN(color_id) = MAX(color_id) AND
       MIN(color_id) = 1;

你也可以使用NOT EXISTS

select r.*
from pc_relation r
where r.color_id = 1 and
      not exists (select 1
                  from pc_relation r2
                  where r2.product_id = r.product_id and r2.color_id <> r.color_id
                 );

但是, GROUP BY方法更通用。

暫無
暫無

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

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