我有一个名为“奖学金”的表,其中有一个名为“专业”的字段,其中包含与奖学金相关的专业的逗号分隔的专业名称。
假设该字段可以包含以下内容中的一个(或多个)(用逗号分隔):business、agribusiness、business more、international business。
如果有人搜索“业务”作为专业,我如何选择“业务”作为匹配,而不是其他匹配?
我最接近的就是这个,但我知道它可能会更好--我的正则表达式能力不是很好。
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[[:>:]]$'我试图抓住这个领域,如果它以“业务”或“业务”或“业务",”业务",而不是“业务管理”等开头……
有什么建议吗?
发布于 2010-09-04 03:31:38
有什么建议吗?
不要将数据存储在逗号分隔的列表中-这是非规范化数据,除了难以分离细节外,还容易出现错误数据(打字错误,区分大小写...)。
MAJORS表:- MAJOR\_ID (primary key)
- MAJOR\_NAME
SCHOLARSHIP_MAJORS
- SCHOLARSHIP\_ID (primary key, foreign key to SCHOLARSHIPS table)
- MAJOR\_ID (primary key, foreign key to MAJORS table)
从奖学金中选择s.scholarship_id,s.scholarship_award_name,m.major_name s JOIN SCHOLARSHIP_MAJORS sm ON sm.scholarship_id = s.scholarship_id加入专业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-04 03:44:46
我能够通过禁止字母字符来改进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-04 10:42:24
我花了一些时间使用regexp,因为我正在处理的数据库有几个CSV类型字段。
基准测试显示,这是一种语法更简单的好方法:
SELECT * FROM table WHERE FIND_IN_SET('string', my_field)有问题的字段必须是CSV字符串字段。完美地解决了我的问题。是的,我承认多对多表是一种更规范化的方式。
https://stackoverflow.com/questions/3638871
复制相似问题