![](/img/trans.png)
[英]SQL - Select only rows with one result on table with one or multiple options - Relation Table
[英]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.