MYSQL REGEXP/RLIKE建议?

MYSQL REGEXP/RLIKE建议?,sql,mysql,regex,codeigniter,rlike,Sql,Mysql,Regex,Codeigniter,Rlike,我有一个名为“奖学金”的表,其中有一个名为“专业”的字段,其中包含与奖学金相关的专业的逗号分隔的专业名称 假设该字段可以包含以下内容之一(或多个以逗号分隔):企业、农业企业、企业管理、国际企业 如果有人将“业务”作为专业搜索,我如何选择“业务”作为匹配项而不是其他匹配项 我最接近的是这个,但我知道它可能会更好-我的正则表达式能力不是很强 SELECT scholarship_id, scholarship_award_name, scholarship_majors FROM scholars

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

假设该字段可以包含以下内容之一(或多个以逗号分隔):企业、农业企业、企业管理、国际企业

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

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

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[[:>:]]$'
选择奖学金id、奖学金名称、奖学金专业
奖学金
奖学金的主修科目是“[,]”[::][,]”
或奖学金,如“^[::][,]”
或者像“[,][::][$”这样的奖学金
我试图抓住这个领域,如果它以“商业”或“商业”或“商业”、“商业”,而不是“商业管理”等开头

有什么建议吗?

有什么建议吗? 不要将数据存储在逗号分隔的列表中-这是非规范化的数据,除了很难隔离具体内容外,还容易出现错误数据(打字错误、区分大小写…)

  • 定义一个
    MAJORS
    表:

    • 主键ID(主键)
    • 少校名称
  • 使用多对多表将奖学金加入一个或多个专业:

    大学专业奖学金
    • 奖学金ID(奖学金表的主键、外键)
    • 主键ID(主键,主键表的外键)
  • 根据专业使用连接获得奖学金:

    SELECT s.scholarship_id, 
           s.scholarship_award_name, 
           m.major_name
      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_CONCAT函数:

        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
    

    我可以通过禁止alpha字符来改进sql,如:

    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[[:>:]]$'
    
    选择奖学金id、奖学金名称、奖学金专业
    奖学金
    奖学金的主修科目是“[,][^a-z][[::][^a-z][,]”
    或奖学金,如“^[[::][^a-z][,]”
    或者像“[,][^a-z][[::]]$”这样的奖学金
    
    这似乎是我所希望的方式


    仍在寻找改进此SQL语句的建议。

    我花了一些时间与regexp进行斗争,因为我正在处理的数据库有几个CSV类型的字段

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

    SELECT * FROM table WHERE FIND_IN_SET('string', my_field)
    
    该字段必须是CSV字符串字段。完美解决我的问题。是的,我承认多对多表是一种更加规范化的方式