我有一个包含产品和标签列的多对多表。如何查询“向我提供其映射中只有其中一个标签的产品列表。
输入:'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 |
+------+-------+
答案 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;