0

我有一个名为“scholarships”的表,其中有一个名为“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[[:>:]]$'

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

有什么建议吗?

4

3 回答 3

2

有什么建议吗?

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

  1. 定义一个MAJORS表:

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

    奖学金_专业

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

    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
于 2010-09-03T19:31:38.010 回答
0

因为我正在处理的数据库有几个 CSV 类型字段,所以我花了一些时间与正则表达式作斗争。

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

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

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

于 2010-09-04T02:42:23.780 回答
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 语句。

于 2010-09-03T19:44:46.167 回答