开发者社区> 问答> 正文

SQL多对多匹配

我正在为网站实施标记系统。每个对象有多个标签,每个标签有多个对象。这是通过维护一个表来实现的,该表每条记录具有两个值,其中一个用于对象ID和标签。

我正在寻找编写查询以查找与给定标记集匹配的对象。假设我有以下数据([对象]-> [标签] *格式)

apple -> fruit red food banana -> fruit yellow food cheese -> yellow food firetruck -> vehicle red 如果要匹配(红色),我应该拿苹果和救火车。如果我想搭配(水果,食物),我应该拿(苹果,香蕉)。

我该如何编写SQL查询来做我想做的事情?

@杰里米·鲁滕(Jeremy Ruten),

感谢您的回答。所使用的符号用于提供一些示例数据-我的数据库确实有一个表,该表具有1个对象ID和每个记录1个标签。

其次,我的问题是我需要获取与所有标签匹配的所有对象。将您的OR替换为AND,如下所示:

SELECT object WHERE tag = 'fruit' AND tag = 'food'; 运行时不产生任何结果。

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-15 17:54:48 519 0
1 条回答
写回答
取消 提交回答
  • 鉴于:

    对象表(主键ID) objecttags表(外键objectId,tagid) 标签表(主键ID)

    SELECT distinct o.* from object o join objecttags ot on o.Id = ot.objectid join tags t on ot.tagid = t.id where t.Name = 'fruit' or t.name = 'food'; 这似乎是向后的,因为您想要,但问题是2个标签不在同一行,因此an和不产生任何结果,因为1行不能既是水果又是食物。此查询通常会产生重复项,因为每个标签每个对象将获得1行。

    如果您确实希望这样做,并且在这种情况下,例如,您的查询中将需要一个group by和having count = 。

    SELECT distinct o.name, count(*) as count from object o join objecttags ot on o.Id = ot.objectid join tags t on ot.tagid = t.id where t.Name = 'fruit' or t.name = 'food' group by o.name having count = 2;

    2019-11-15 17:54:59
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server在电子商务中的应用与实践 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载