2015-01-11 90 views
0

我有一个包含产品和标签列的多对多表。如何查询“给我这只有在他们的映射,这些标签中的一个产品清单在多对多表中选择只有一个映射的列

输入:‘3’(这相当于标签识别列映射表) 产出预期:4(相当于到ProductID列值INT映射的他最后一排。请注意的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; 
+0

我编辑了我的问题。请检查。 – yagnasri

+0

如果产品的tagid小于3,该怎么办?最大值只给出最大值。不是吗? – yagnasri

+0

@yagnasri。 。 。要求是只有一个标签。因此,一行的max()是该行的值。 –