从两张表提取数据并基于包含值进行比较

我记得有一次,在一家小型的IT公司里,我们遇到了一个棘手的问题。
我们有一个用户数据库,里面存储了用户的兴趣和技能,这些信息是用逗号分隔的字符串存储的。
比如,一个用户的技能可能是“编程,设计,数据分析”。
我们的任务是找出所有拥有“编程”技能的用户,但是我们不能使用简单的LIKE查询,因为这样会错过那些技能列表中包含“编程”但是后面还有其他技能的用户。

那时候,我刚好接触到了MySQL的REGEXP函数,觉得这是一个解决这个问题的好方法。
我花了几个小时,结合了表连接和正则表达式,终于写出了一段SQL代码,可以准确地找出所有包含“编程”技能的用户。

那段代码是这样的:
sql SELECT t2 . FROM Table1 AS t1 JOIN Table2 AS t2 ON t2 .rank REGEXP REPLACE(t1 .skill, ',', '|') WHERE t1 .username = 'user1 2 3 ';
这个查询的逻辑是,首先将用户技能字段(skill)中的逗号替换为管道符(|),这样就将技能列表转换成了一个正则表达式,然后使用REGEXP函数来匹配Table2 中的rank列。

当时,当我看到查询结果,那些技能列表中包含“编程”的用户都被准确地找出来了,我感到非常自豪。
不过,我也意识到,虽然这个方法解决了问题,但是在处理大量数据时可能会遇到性能问题。

等等,我突然想到,如果我们能够对rank列建立索引,那不就能提高查询效率了吗?不过,我也有点疑惑,这样的索引是否会对数据库的其他操作产生影响呢?
这个小小的经历让我对数据库查询和正则表达式的运用有了更深的理解。

这堆代码一看就是百度知道后台的玩意儿。
我混迹问答论坛行业这么多年,这种代码看了不少。
先说这“帮助”和“意见反馈”,这都是为了方便用户嘛。
你看这京ICP证03 01 7 3 号-1 ,那是百度知道合法运营的证明,就像身份证一样。

然后这“京网文【2 02 3 】1 03 4 -02 9 号”,那是百度知道发布的网络内容许可证,就像出版物要有个出版号一样。
这“©2 02 6 Baidu”,就是百度知道版权所有,就像你写篇文章得注明版权一样。

再看看这脚本,一堆的“require”和“async”,这都是为了加载各种模块和资源,让页面运行得更顺畅。
比如那个“common-new:widget/userbar-renew/userbar-renew”,这就是用户栏的模块,用户登录后能看到那个。

还有这个“common-new:widget/search-box-new/search-box-new”,那是搜索框的模块,你输入问题后就会调用它。
这堆代码里还有“common-new:widget/footer/footer”,那是页脚的模块,包含版权信息、联系方式那些。

说实话,我当时也没想明白这些代码具体怎么运作,但我知道它们是让百度知道这个网站能正常工作的关键。
就像你家的电灯,虽然你不懂电路,但你知道按开关就能亮灯一样。

如何在SQL中使用LIKE?模糊查询的模式匹配技巧

LIKE是SQL里做模糊查询的标配。

通配符就俩:% 和 _。

% 匹配任意多个字符。
比如 'abc%' 匹配 abc 开头的词。
'%xyz' 匹配 xyz 结尾的词。
'%mno%' 匹配中间有 mno 的词。

_ 匹配单个字符。
比如 'a_c' 匹配 a 开头 c 结尾的,中间一个字符。
'___' 匹配正好三个字符的词。

组合用更精确。
比如 'Data__%_Report' 匹配 Data 开头,中间至少两个字符,以 Report 结尾的词。

转义用 ESCAPE。
比如数据里本来就有 '%',那就用 ESCAPE 指定转义符。
匹配 '1 00%OFF' 这种词,写法是 LIKE '1 00%OFF' ESCAPE ''。

NOT LIKE 用来排除。
比如查不包含 '测试' 的产品名:NOT LIKE '%测试%'。

AND/OR 组合。
比如查 A 开头,包含 B 但不包含 C 的产品: LIKE 'A%' AND LIKE '%B%' AND NOT LIKE '%C%'。

LIKE 和 REGEXP/RLIKE 对比。
LIKE 简单快,适合简单匹配。
REGEXP/RLIKE 支持正则,适合复杂匹配。
但正则慢,大数据量慎用。

性能优化: 1 . 避免 % 在开头。
2 . 加其他条件缩小范围。
3 . 考虑函数索引。

简单匹配用 LIKE。
复杂匹配用 REGEXP。
要快就加索引。

算了。