MYSQL REGEXP / RLIKE建议?

时间:2010-09-03 19:19:14

标签: sql mysql regex codeigniter rlike

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

假设该字段可能包含以下内容之一(或以逗号分隔):业务,农业综合企业,工商管理,国际业务。

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

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

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[[:>:]]$'

如果它以“业务”或“业务”或“业务”,“业务”开头,而不是“业务管理”等,我试图赶上该领域......

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

有什么建议吗?

不要将数据存储在以逗号分隔的列表中 - 这是非规范化数据,除了难以隔离细节之外,还容易出现错误数据(错别字,案例敏感性......)。

  1. 定义MAJORS表:

    • MAJOR_ID(主键)
    • MAJOR_NAME
  2. 使用多对多表格将奖学金加入一个或多个专业:

    SCHOLARSHIP_MAJORS

    • SCHOLARSHIP_ID(主键,SCHOLARSHIPS表的外键)
    • MAJOR_ID(主键,MAJORS表的外键)
  3. 使用JOIN获得基于专业的奖学金:

    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')
    
  4. ...如果你想要以逗号分隔的列表输出主要内容,请使用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
    

答案 1 :(得分:0)

我能够通过禁止像以下字母字符来改进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[[:>:]]$'

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

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

答案 2 :(得分:0)

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

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

SELECT * FROM table WHERE FIND_IN_SET('string', my_field)

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