我有一个学生表,看起来像这样:
id | name | school_descriptors
-------------------------------------------------------
1 | Rob | Comp Sci,Undergraduate,2020
2 | Tim | Business,MBA,2022
3 | Matt | Business,MBA,2022
4 | Jack | Law,Masters,2024
5 | Steph | Comp Sci,Masters,2022
字符串
school_descriptors字段只是一个列,以逗号分隔的字符串存储有关课程,资格和毕业年份的信息。(它的设计非常糟糕,我希望它可以被分割成自己的字段,但现在不能(我不是数据库所有者))
我想提供一个界面,教师可以快速找到符合某些课程,资格和毕业年份的学生,从而希望创建相关查询。
**问题1:例如,我希望教师能够从UI中选择:“Business”,“MBA”并获得ID为2和3的返回学生。具体来说,我的示例问题是: 查找正在学习Business课程并正在进行MBA资格认证的学生:
SELECT * FROM student_table WHERE school_descriptors LIKE '%Business%' AND school_descriptors LIKE '%MBA%'
型
我想到的查询是一个基本的LIKE查询,但我不禁想到有一个更有效的查询,它可以利用school_descriptor字符串1)总是以特定顺序的事实(例如,课程、资格、毕业),以及2)逗号分隔,并且因此可能被拆分。
相关问题2:* 查找2019年后毕业的Comp Sci课程学生:*
是否可以拆分school_descriptors字段并添加一个>2019
操作数?
多谢了!
4条答案
按热度按时间clj7thdc1#
在MySQL中,你可以使用函数
SUBSTRING_INDEX()
来拆分列school_descriptors
。只有在课程、资格和毕业年份的位置固定的情况下,这才有效。
字符串
参见demo。
结果如下:
型
xqkwcwgp2#
字符串
产出:
型
如果你想了解SUBSTRING_INDEX(),可以使用文档的链接。
polkgigr3#
回答1:
字符串
通过使用此查询,您可以获得所有具有Business或MBA的记录。如果您只想选择Business,MBA,您可以这样尝试
SELECT * FROM student_table WHERE school_descriptors LIKE '%Business,MBA%'
回答二:
型
4zcjmb1e4#
LIKE运算符不是最佳选择。在某些情况下,LIKE运算符会让我们失败。例如,如果您有一个Master Business in School描述符,LIKE运算符列也会拉取该记录。要找到精确的匹配,您需要使用RLIKE
字符串