首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL REGEXP/RLIKE建议?

MYSQL REGEXP/RLIKE建议?
EN

Stack Overflow用户
提问于 2010-09-04 03:19:14
回答 3查看 1.7K关注 0票数 0

我有一个名为“奖学金”的表,其中有一个名为“专业”的字段,其中包含与奖学金相关的专业的逗号分隔的专业名称。

假设该字段可以包含以下内容中的一个(或多个)(用逗号分隔):business、agribusiness、business more、international business。

如果有人搜索“业务”作为专业,我如何选择“业务”作为匹配,而不是其他匹配?

我最接近的就是这个,但我知道它可能会更好--我的正则表达式能力不是很好。

代码语言:javascript
复制
SELECT scholarship_id, scholarship_award_name, scholarship_majors 
FROM scholarships 
WHERE scholarship_majors rlike '[, ][[:<:]]business[[:>:]][, ]'
OR scholarship_majors rlike '^[[:<:]]business[[:>:]][, ]'
OR scholarship_majors rlike '[, ][[:<:]]business[[:>:]]$'

我试图抓住这个领域,如果它以“业务”或“业务”或“业务",”业务",而不是“业务管理”等开头……

有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 2010-09-04 03:31:38

有什么建议吗?

不要将数据存储在逗号分隔的列表中-这是非规范化数据,除了难以分离细节外,还容易出现错误数据(打字错误,区分大小写...)。

  1. 定义MAJORS表:

代码语言:javascript
复制
- MAJOR\_ID (primary key)
- MAJOR\_NAME

  1. 使用多对多表格将奖学金加入一个或多个专业:

SCHOLARSHIP_MAJORS

代码语言:javascript
复制
- SCHOLARSHIP\_ID (primary key, foreign key to SCHOLARSHIPS table)
- MAJOR\_ID (primary key, foreign key to MAJORS table)

  1. 使用JOIN获得基于专业的奖学金:

从奖学金中选择s.scholarship_id,s.scholarship_award_name,m.major_name s JOIN SCHOLARSHIP_MAJORS sm ON sm.scholarship_id = s.scholarship_id加入专业m ON m.major_id = sm.major_id WHERE m.major_name IN ('a','b','c')

如果希望在逗号分隔的列表中输出专业,请使用GROUP_CONCAT函数:

代码语言:javascript
复制
    SELECT s.scholarship_id, 
           s.scholarship_award_name, 
           GROUP_CONCAT(m.major_name) AS majors
      FROM SCHOLARSHIPS s
      JOIN SCHOLARSHIP_MAJORS sm ON sm.scholarship_id = s.scholarship_id
      JOIN MAJORS m ON m.major_id = sm.major_id
     WHERE m.major_name IN ('a', 'b', 'c')
  GROUP BY s.scholarship_id, s.scholarship_award_name
票数 2
EN

Stack Overflow用户

发布于 2010-09-04 03:44:46

我能够通过禁止字母字符来改进sql,例如:

代码语言:javascript
复制
SELECT scholarship_id, scholarship_award_name, scholarship_majors 
FROM scholarships 
WHERE scholarship_majors rlike '[, ][^a-z][[:<:]]business[[:>:]][^a-z][, ]'
OR scholarship_majors rlike '^[[:<:]]business[[:>:]][^a-z][, ]'
OR scholarship_majors rlike '[, ][^a-z][[:<:]]business[[:>:]]$'

这似乎捕捉到了我希望的方式!

我还在寻找任何建议来改进这条SQL语句。

票数 0
EN

Stack Overflow用户

发布于 2010-09-04 10:42:24

我花了一些时间使用regexp,因为我正在处理的数据库有几个CSV类型字段。

基准测试显示,这是一种语法更简单的好方法:

代码语言:javascript
复制
SELECT * FROM table WHERE FIND_IN_SET('string', my_field)

有问题的字段必须是CSV字符串字段。完美地解决了我的问题。是的,我承认多对多表是一种更规范化的方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3638871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档