2017-06-02 182 views
0

我正在玩標籤數據庫,並且想知道如何構建查詢以獲取標籤列表,標記應用於給定項目的每個標籤,如下所示:選擇標籤和項目的關聯

Table 1 
item name | item ID 
--------------------- 
One   | 1 
Two   | 2 
Three  | 3 

Table 2 
tag name | tag ID 
-------------------- 
Tag1  | 1 
Tag2  | 2 
Tag3  | 3 

Mapper 
tag ID  | item ID | map ID 
-------------------------------- 
1   | 1  | 1 
1   | 3  | 2 
3   | 1  | 3 

Tags for item One 
tag name  | is_tagged 
------------------------------- 
Tag1   | * 
Tag2   | 
Tag3   | * 

我該怎麼做?

回答

2

這裏有一個簡單的方法:

select t.tagname, 
     (case when exists (select 1 
          from mapper m join 
           items i 
           on m.item_id = i.item_id 
          where i.item_name = 'One' and 
           m.tag_id = t.tag_id 
         ) 
      then '*' else '' 
     end) as is_tagged 
from tags t; 

您也可以使用left join寫點什麼這樣的:

select t.tagname, 
     (case when i.item_id is not null then '*' else '' 
     end) as is_tagged 
from tags t left join 
    mapper m 
    on m.tag_id = t.tag_id left join 
    items i 
    on m.item_id = i.item_id and i.item_name = 'One' 
+0

太棒了,謝謝!我如此包裝瞭解INNER JOIN,我忘了所有其他類型的JOIN。 –

0

你可以做向左或向右加入表2表1通過映射器表,然後測試列表2對於NULL值。例如:

SELECT 
    TagName, ItemID IS NOT NULL AS IsTagged 
FROM 
    Table2 
    LEFT JOIN 
    (SELECT TagID, ItemID 
    FROM Mapper INNER JOIN Table1 
    WHERE ItemName = 'One') AS tmpQry 
    USING(TagID);