【问题标题】:Artist-tag database: Getting tags艺术家标签数据库:获取标签
【发布时间】:2009-12-16 15:55:44
【问题描述】:

我正在创建一个数据库,该数据库将包含可以用多个标签标记的各种艺术家。这是一个标准的多对五关系,我的数据库如下所示:

artist:  
 ID
 name  

tag:
 ID
 name

tagID:
 tagID
 artistID

假设我有两个 tagID,X 和 Y。我想做的是找到所有与标签 X 和 Y 有共同艺术家的标签。我该怎么做?

最终,我希望它变成一个界面,让您可以找到带有任意标签集的艺术家。为了使过程更简单,我想过滤掉不会给出任何结果的标签组合。

【问题讨论】:

  • 艺术家应该同时被标记为 X 和 Y,还是她可以被标记为 X 或 Y?
  • 艺术家应该被标记为 X 和 Y

标签: sql database many-to-many tags


【解决方案1】:
SELECT T.tagID
  FROM tagID T
  WHERE T.artistID IN (SELECT T1.artistID
                          FROM tagID T1,
                               tagID T2,
                          WHERE T1.tagID = X AND
                                T2.artistID = T1.artistID AND
                                T2.tagID = Y)

分享和享受。

【讨论】:

  • 看起来很有希望,但我在理解您的代码时遇到了一些问题。你说的 T1 和 T 是什么意思?
  • 表的别名。外部查询中的 tagID = T1,子查询中的 tagID = T。它有助于阐明列名来自表的哪个实例。
  • 现在可以正常工作了,这正是我所需要的。非常感谢!
  • 但这是否要求艺术家同时拥有 X 和 Y?看起来它会选择任何具有 X 或 Y 的艺术家。
  • 啊,我写答案时没有看到 Paul 对原始问题的评论。不,我的回答不需要艺术家同时拥有 X 和 Y。必须解决这个问题。
【解决方案2】:

此解决方案使用INTERSECT 集合运算符来识别同时具有标签 X 和标签 Y 的艺术家的 TagID 记录。如果您使用不支持该集合运算符的数据库风格,则必须使用改为普通连接。

select distinct tagid
from   tagid 
where tagid not in ('X', 'Y')
where artistid in 
        ( select artistid
          from tagid 
          where tagid = 'X'
        intersect
        select artistid
          from tagid 
          where tagid = 'Y' )
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    相关资源
    最近更新 更多