在“多对多”表中选择仅包含一个映射的列

时间:2015-01-11 17:37:48

标签: mysql sql

我有一个包含产品和标签列的多对多表。如何查询“向我提供其映射中只有其中一个标签的产品列表。

输入:'3'(这对应于Mappings表中的tagid列) 输出预期:4(这对应于映射的最后一行中的productid列值。请注意不返回productid 1,因为1具有与之关联的其他映射(标记1和标记2))。

-- Table: Product
+---------+-----------+
| productid | name      |
+---------+-----------+
|       1 | HTC       |
|       2 | Nokia     |
|       3 | Samsung   |
|       4 | Motorolla |
+---------+-----------+

-- Table: Mappings
+------+-----------+
| tagid| productid |
+------+-----------+
|    1 |       1   |
|    1 |       2   |
|    2 |       1   |
|    2 |       3   |
|    3 |       1   |
|    3 |       4   |
+------+-----------+

-- Table: Tags
+------+-------+
| tagid  | name  |
+------+-------+
|    1 | blue   |
|    2 | black  |
|    3 | pink   |
+------+-------+

1 个答案:

答案 0 :(得分:2)

您在寻找having条款吗?

select producctid
from mappings m
group by productid
having count(*) = 1;

如果你还想要标签id,你可以轻松搞定:

select producctid, max(tagid) as tagid
from mappings m
group by productid
having count(*) = 1;

由于mapping中只有一个标记,max()将返回该标记。

编辑:

如果要指定单个映射,则可以使用:

select producctid, max(tagid) as tagid
from mappings m
group by productid
having count(*) = 1 and max(tagid) = 3;