我有一个填充了100万个对象的数据库.每个对象都有一个’tags’字段 – 整数集.
例如:
object1: tags(1,3,4)
object2: tags(2)
object3: tags(3,4)
object4: tags(5)
等等.
object1 does not match ('1' not in '3,4,5')
object2 does not match ('2' not in '3,4,5')
object3 matches ('3 and 4' in '3,4,5' )
object4 matches ('5' in '3,4,5' )
如何有效地选择匹配的对象?
解决方法:
你在数据库设计中犯了一个常见的错误,就是存储一个逗号分隔的标签ID列表.对此进行高效查询对您来说是一种阻碍并不奇怪.
CREATE TABLE Tagged (
object_id INT NOT NULL,
tag_id INT NOT NULL,
PRIMARY KEY (object_id, tag_id),
FOREIGN KEY (object_id) REFERENCES Objects(object_id),
FOREIGN KEY (tag_id) REFERENCES Tags(tag_id)
);
为每个对象/标签配对插入一行.当然,这意味着每个object_id都有几行,但这没关系.
SELECT disTINCT object_id
FROM Tagged
WHERE tag_id IN (3, 4, 5);
但是这匹配了你不想要的object1.您希望排除具有不在3,4,5中的其他标记的对象.
SELECT disTINCT t1.object_id
FROM Tagged t1
LEFT OUTER JOIN Tagged t2
ON (t1.object_id = t2.object_id AND t2.tag_id NOT IN (3, 4, 5))
WHERE t1.tag_id IN (3, 4, 5)
AND t2.object_id IS NULL;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。