mysql 搜索逗号分隔字段的SQL查询

vqlkdk9b  于 2024-01-05  发布在  Mysql
关注(0)|答案(4)|浏览(153)

我有一个学生表,看起来像这样:

  1. id | name | school_descriptors
  2. -------------------------------------------------------
  3. 1 | Rob | Comp Sci,Undergraduate,2020
  4. 2 | Tim | Business,MBA,2022
  5. 3 | Matt | Business,MBA,2022
  6. 4 | Jack | Law,Masters,2024
  7. 5 | Steph | Comp Sci,Masters,2022

字符串
school_descriptors字段只是一个列,以逗号分隔的字符串存储有关课程,资格和毕业年份的信息。(它的设计非常糟糕,我希望它可以被分割成自己的字段,但现在不能(我不是数据库所有者))
我想提供一个界面,教师可以快速找到符合某些课程,资格和毕业年份的学生,从而希望创建相关查询。

**问题1:例如,我希望教师能够从UI中选择:“Business”,“MBA”并获得ID为2和3的返回学生。具体来说,我的示例问题是: 查找正在学习Business课程并正在进行MBA资格认证的学生:

  1. 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操作数?
多谢了!

clj7thdc

clj7thdc1#

在MySQL中,你可以使用函数SUBSTRING_INDEX()来拆分列school_descriptors
只有在课程、资格和毕业年份的位置固定的情况下,这才有效。

  1. select *,
  2. substring_index(school_descriptors, ',', 1) Course,
  3. substring_index(substring_index(school_descriptors, ',', 2), ',', -1) Qualification,
  4. substring_index(school_descriptors, ',', -1) Graduation
  5. from student_table

字符串
参见demo
结果如下:

  1. > id | name | school_descriptors | Course | Qualification | Graduation
  2. > -: | :---- | :-------------------------- | :------- | :------------ | :---------
  3. > 1 | Rob | Comp Sci,Undergraduate,2020 | Comp Sci | Undergraduate | 2020
  4. > 2 | Tim | Business,MBA,2022 | Business | MBA | 2022
  5. > 3 | Matt | Business,MBA,2022 | Business | MBA | 2022
  6. > 4 | Jack | Law,Masters,2024 | Law | Masters | 2024
  7. > 5 | Steph | Comp Sci,Masters,2022 | Comp Sci | Masters | 2022

展开查看全部
xqkwcwgp

xqkwcwgp2#

  1. select id, name,
  2. substring_index(school_descriptors,',',1) as course,
  3. substring_index(substring(school_descriptors,length(substring_index(school_descriptors,',',1))+2,200),',',1) as Qualifications,
  4. substring_index(school_descriptors,',',-1) as year
  5. from student;

字符串
产出:

  1. +------+-------+----------+----------------+------+
  2. | id | name | course | Qualifications | year |
  3. +------+-------+----------+----------------+------+
  4. | 1 | Rob | Comp Sci | Undergraduate | 2020 |
  5. | 2 | Tim | Business | MBA | 2022 |
  6. | 3 | Matt | Business | MBA | 2022 |
  7. | 4 | Jack | Law | Masters | 2024 |
  8. | 5 | Steph | Comp Sci | Masters | 2022 |
  9. +------+-------+----------+----------------+------+


如果你想了解SUBSTRING_INDEX(),可以使用文档的链接。

展开查看全部
polkgigr

polkgigr3#

回答1:

  1. SELECT * FROM student_table WHERE school_descriptors REGEXP ['Business','MBA']

字符串
通过使用此查询,您可以获得所有具有Business或MBA的记录。如果您只想选择Business,MBA,您可以这样尝试
SELECT * FROM student_table WHERE school_descriptors LIKE '%Business,MBA%'

回答二:

  1. SELECT *
  2. FROM student
  3. WHERE
  4. SUBSTRING_INDEX(SUBSTRING_INDEX(school_descriptors , ',', 1), ',', -1)='Comp Sci'
  5. AND
  6. SUBSTRING_INDEX(SUBSTRING_INDEX(school_descriptors , ',', 3), ',', -1)> 2019;

展开查看全部
4zcjmb1e

4zcjmb1e4#

LIKE运算符不是最佳选择。在某些情况下,LIKE运算符会让我们失败。例如,如果您有一个Master Business in School描述符,LIKE运算符列也会拉取该记录。要找到精确的匹配,您需要使用RLIKE

  1. SELECT * FROM student_table WHERE school_descriptors RLIKE '[[:<:]]'Business'[[:>:]]' AND school_descriptors RLIKE '[[:<:]]'MBA'[[:>:]]'

字符串

相关问题