2017-06-02 125 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);