2015-01-11 129 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()是該行的值。 –