我有一个学生桌,看起来像这样:
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:例如,我希望老师可以从用户界面中选择“业务”,“ MBA”,并返回ID为2和3的返回学生。我有一个示例问题:找到正在学习商务课程并获得MBA资格的学生:
SELECT * FROM student_table WHERE school_descriptors LIKE '%Business%' AND school_descriptors LIKE '%MBA%'
我想到的查询是一个基本的LIKE查询,但我不禁想到有一个更有效的查询,可以利用以下事实:school_descriptor字符串始终为1)(始终按特定顺序排列)课程,资格,毕业)和2)以逗号分隔,因此可能会分开。该表目前位于约5000行,因此相对较小,但预计会增长。
相关问题2 :查找参加Comp Sci课程并在2019年毕业的学生:
是否可以拆分school_descriptors字段并添加一个>2019
操作数?
非常感谢!
答案 0 :(得分:1)
select id, name,
substring_index(school_descriptors,',',1) as course,
substring_index(substring(school_descriptors,length(substring_index(school_descriptors,',',1))+2,200),',',1) as Qualifications,
substring_index(school_descriptors,',',-1) as year
from student;
输出:
+------+-------+----------+----------------+------+
| id | name | course | Qualifications | year |
+------+-------+----------+----------------+------+
| 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 |
+------+-------+----------+----------------+------+
指向文档的链接,以防您想了解SUBSTRING_INDEX()
答案 1 :(得分:1)
在MySql中,您可以使用函数SUBSTRING_INDEX()
拆分列school_descriptors
。
仅在课程,资格和毕业年份的职位固定的情况下才有效。
select *,
substring_index(school_descriptors, ',', 1) Course,
substring_index(substring_index(school_descriptors, ',', 2), ',', -1) Qualification,
substring_index(school_descriptors, ',', -1) Graduation
from student_table
请参见demo。
结果:
> id | name | school_descriptors | Course | Qualification | Graduation
> -: | :---- | :-------------------------- | :------- | :------------ | :---------
> 1 | Rob | Comp Sci,Undergraduate,2020 | Comp Sci | Undergraduate | 2020
> 2 | Tim | Business,MBA,2022 | Business | MBA | 2022
> 3 | Matt | Business,MBA,2022 | Business | MBA | 2022
> 4 | Jack | Law,Masters,2024 | Law | Masters | 2024
> 5 | Steph | Comp Sci,Masters,2022 | Comp Sci | Masters | 2022
答案 2 :(得分:1)
答案1:
SELECT * FROM student_table WHERE school_descriptors REGEXP ['Business','MBA']
使用此查询,您可以获得具有商务或MBA的所有记录。 如果您只想选择商业,MBA ,则可以尝试这样
选择*来自学生表,在“学校”描述符中,类似于“%Business,MBA%”
答案2:
SELECT *
FROM student
WHERE
SUBSTRING_INDEX(SUBSTRING_INDEX(school_descriptors , ',', 1), ',', -1)='Comp Sci'
AND
SUBSTRING_INDEX(SUBSTRING_INDEX(school_descriptors , ',', 3), ',', -1)> 2019;