我正在为网站实施标记系统。每个对象有多个标签,每个标签有多个对象。这是通过维护一个表来实现的,该表每条记录具有两个值,其中一个用于对象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
鉴于:
对象表(主键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;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。