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')
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字符串字段。完美解决我的问题。是的,我承认多对多表是一种更加规范化的方式