![](/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.