繁体   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