请教一个 SQL 按关键词查询的问题

2021-01-09 17:16:21 +08:00
 yodhcn
假设有表
t_user
id column_1 column_2 column_3

t_tag
id name

r_user_tag
tag_id user_id

前端传来一组关键字 "keyword_A keyword_B|keyword_C -keyword_D"
要求查询包含 "keyword_A" 且 包含 "keyword_B"或"keyword_C" 且不包含 "keyword_D" 的 user 的结果

注:关键字 keyword 可能出现在 column_1,column_2,column_3,t_tag.name



像这种情景,该如何编写 SQL 查询语句?

是不是应该在 t_user 新增一个 search 列,在插入数据时,先将关键词提前拼接好存到 search 里,再在查询时根据 search 查找关键词,这样做更好些?
3309 次点击
所在节点    MySQL
6 条回复
test3207
2021-01-09 17:41:44 +08:00
不要在数据库里搞搜索好些……虽然有些数据库有类似分词插件的邪道玩法,但是搞搜索 es 才是正统啊
dfzj
2021-01-09 17:43:25 +08:00
如果不考虑执行效率,只考虑开发效率,可以这样干:构造一张新表,把字段拼接起来,
然后用新造字段去匹配条件:
SELECT * FROM
(SELECT concat(column_1, column_2, column_3, t_tag) as ccc,
...
FROM t_user left join t_tag) as A
WHERE ccc like keyword_A and ccc like keyword_B and ccc like keyword_C
AND ccc not like keyword_D

显然上述方法没办法走索引。
另外现在直接写 SQL 就可以快速开发系统了: wuyuan.io
w504391883
2021-01-09 17:43:35 +08:00
一楼说的对呀,怎么写都感觉邪门歪道,如果条件所限,只能笨办法来了
yodhcn
2021-01-09 19:06:50 +08:00
@dfzj #2 确实我也很疑惑,"ccc like %keywork_A%" 用不到索引,用 SQL 搜索关键字是不是只能逐行比对?
在我的使用场景中,数据库中至多有 1 万 行数据,请问这种情况下,用 SQL 搜索关键字是否可行?
sunsijia
2021-01-09 19:17:35 +08:00
一楼说的对,搞个搜索吧
dfzj
2021-01-09 23:31:02 +08:00
@yodhcn 如果至多一万行的话,那不用在意什么执行效率了,可以尝试

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

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

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

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

© 2021 V2EX