我有一张名为“奖学金”的表格,其中有一个名为“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[[:>:]]$'
如果它以“业务”或“业务”或“业务”,“业务”开头,而不是“业务管理”等,我试图赶上该领域......
有什么建议吗?
答案 0 :(得分:2)
不要将数据存储在以逗号分隔的列表中 - 这是非规范化数据,除了难以隔离细节之外,还容易出现错误数据(错别字,案例敏感性......)。
定义MAJORS
表:
使用多对多表格将奖学金加入一个或多个专业:
使用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')
...如果你想要以逗号分隔的列表输出主要内容,请使用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字符串字段。完美解决我的问题。是的,我承认很多表是一种更为规范化的方式。