SQL 求教:标签相关问题

2017-12-18 06:09:14 +08:00
 nikoo
表 doc
id   name
--------------------------------
1   文章 A
2   文章 B
3   文章 C

表 tag
doc_id   tag
--------------------------------
1    标签 A
1    标签 B
2    标签 A
2    标签 C
2    标签 D
3    标签 B

SQL 问题:
1、如何列出包含"标签 A"的 doc 记录?
2、如何列出不包含"标签 B"的 doc 记录?
2423 次点击
所在节点    问与答
27 条回复
nikoo
2017-12-18 12:32:46 +08:00
@SuperMild 请问 doc_ids 这个字段是什么类型的?根据这个字段排除某标签的 SQL 应怎么写?
nikoo
2017-12-18 12:35:49 +08:00
@SuperMild #19 的意思是,doc_ids 这个字段包含的是文章 ID,那么普通项目一个"技术"类标签下有个几千篇文章,于是这个 doc_ids 字段要存几千个 doc_id ?
SuperMild
2017-12-18 12:39:36 +08:00
SuperMild
2017-12-18 12:46:35 +08:00
@nikoo 如果只有几千,那完全可以接受
tomczhen
2017-12-18 12:52:05 +08:00
JSON 类型也避免不了数据量过大的问题,反正查找算法还有数据结构就那些。可以预见的是热门标签的 doc_ids 增加是非常迅速的,大表还能分表解决,大字段该怎么解决?

通过文章来查标签好解决,但是标签反查文章,用关系数据库真不好解决。无论采取那种结构,查询速度明显会因为标签对应文章数据量增加而变慢。

感觉要么做成延迟生效,将查询结果缓存一段时间(不然被 cc 也够呛),追求实时的高一致性技术要求很高。
NullPoint
2017-12-18 16:25:36 +08:00
@halo select doc_id from tag where tag = 'A' and
doc_id not in (select doc_id from tag where tag = 'B')
NullPoint
2017-12-18 16:27:03 +08:00
@nikoo 你这 SQL 语句都是错的,你具体操作下试试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/415554

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX