【问题标题】:mysql query to match some record where column contains multiple comma separated valuesmysql查询以匹配列包含多个逗号分隔值的某些记录
【发布时间】:2014-05-27 10:27:59
【问题描述】:

我正在做一个项目。我有一个表 tblhomework,其中有一列学生代码 - 其中包含用逗号分隔的学生代码。现在我有几个下拉菜单来搜索其中按学生姓名搜索的记录。现在我我的表中有学生代码我应该如何将其与学生姓名进行匹配。我正在使用以下查询,直到现在我正在使用学生代码进行匹配,但现在我必须按学生姓名进行匹配

查询

string studentcode = "%" + txt_studentcode.Text.ToString() + "%";
SELECT 
tblhomework.ID,
tblteacher.TEACHERNAME,
tblclass.CLASSNAME,
tblhomework.Title,
tblhomework.HomeworkDetail,
tblhomework.StudentsCode 
FROM tblhomework 
join tblclass on tblclass.CLASSCODE=tblhomework.ClassCode 
join tblteacher on tblteacher.TSHORTNAME=tblhomework.Tshortcode 
where tblhomework.StudentsCode like'" + studentcode + "';

以下是我得到的结果的截图

我有一个学生表,其中包含您可以使用的学生的学生姓名。

【问题讨论】:

  • 我可以建议改变你的数据库结构并添加映射学生和教师的多对多关系表吗?
  • 我无法更改数据库结构
  • 请对查询提出一些更改建议

标签: c# mysql sql join


【解决方案1】:

在当前 SQL 中使用 FIND_IN_SET:-

SELECT 
    tblhomework.ID,
    tblteacher.TEACHERNAME,
    tblclass.CLASSNAME,
    tblhomework.Title,
    tblhomework.HomeworkDetail,
    tblhomework.StudentsCode 
FROM tblhomework 
JOIN tblclass ON tblclass.CLASSCODE=tblhomework.ClassCode 
JOIN tblteacher ON tblteacher.TSHORTNAME=tblhomework.Tshortcode 
WHERE FIND_IN_SET('" + studentcode + "', tblhomework.StudentsCode);

但是,这仅在学生代码列表中逗号之前/之后没有空格时才有效

要将其与学生姓名表结合起来(并对该表的布局做出假设),请使用以下内容:-

SELECT 
    tblhomework.ID,
    tblteacher.TEACHERNAME,
    tblclass.CLASSNAME,
    tblhomework.Title,
    tblhomework.HomeworkDetail,
    tblhomework.StudentsCode ,
    tblstudent.StudentsName
FROM tblstudent 
JOIN tblhomework ON FIND_IN_SET(tblstudent.StudentsCode, tblhomework.StudentsCode);
JOIN tblclass ON tblclass.CLASSCODE=tblhomework.ClassCode 
JOIN tblteacher ON tblteacher.TSHORTNAME=tblhomework.Tshortcode 
WHERE tblstudent.StudentsCode = '" + studentcode + "'

按学生姓名搜索(虽然通常如果下拉菜单返回数字唯一学生 ID 会更容易):-

SELECT 
    tblhomework.ID,
    tblteacher.TEACHERNAME,
    tblclass.CLASSNAME,
    tblhomework.Title,
    tblhomework.HomeworkDetail,
    tblhomework.StudentsCode ,
    tblstudent.StudentsName
FROM tblstudent 
JOIN tblhomework ON FIND_IN_SET(tblstudent.StudentsCode, tblhomework.StudentsCode);
JOIN tblclass ON tblclass.CLASSCODE=tblhomework.ClassCode 
JOIN tblteacher ON tblteacher.TSHORTNAME=tblhomework.Tshortcode 
WHERE tblstudent.StudentsName = '" + studentname + "'

【讨论】:

  • thanx 它正在工作,如果在选择中我将有学生名而不是 tblhomework 中的学生代码,我必须做些什么改变,因为目前我只有一个学生名(tblstudent.StudentsName)
  • 应该只返回一个学生姓名(如指定的那样),但可以为作业等多行(例如,代码为 10555 的学生姓名应返回多行)。您能否使用表格声明(作为文本,以便它们可以在 sql 中使用,而不是屏幕打印)和一些示例数据以及您需要的输出来更新您的问题。
【解决方案2】:

您可以使用'FIND_IN_SET' 函数以逗号分隔的一组值进行搜索。

如下改变你的 where 子句:

where FIND_IN_SET( @student_code, tblhomework.studentscode );

使用AddWithValue 绑定从文本框中读取的'studentcode' 的值。

string studentcode = txt_studentcode.Text.ToString();
myCommand = new MySqlCommand( sql_query_string, connection );
myCommand.Parameters.AddWithValue( "@student_code", studentcode );

然后执行。

【讨论】:

  • 我知道我可以将 find_in_set() 与 where 子句一起使用,但我必须使用学生姓名而不是学生代码,如何做到这一点
  • 好的。看来kickstart has already posted a valid answer。你可以试试。
【解决方案3】:

在列中存储逗号分隔值是不好的设计,您应该查看Database Normalization 并通过将所有相关的学生代码存储在联结表中来规范您的结构,但是从上面的 cmets 您说您不能更改结构所以在 mysql 中,您可以使用 FIND_IN_SET() 并加入您的学生表,我不熟悉 c# 语法,所以我发布了 mysql 查询,也使用您原来的列名称约定

SELECT 
DISTINCT
  h.ID,
  t.TEACHERNAME,
  c.CLASSNAME,
  h.Title,
  h.HomeworkDetail,
  h.StudentsCode 
FROM
  tblhomework h
  JOIN tblclass c
    ON c.CLASSCODE = h.ClassCode 
  JOIN tblteacher t
    ON t.TSHORTNAME = h.Tshortcode 
  JOIN students s ON(FIND_IN_SET(s.StudentsCode, h.StudentsCode) > 0)
WHERE  FIND_IN_SET('studentcode', h.StudentsCode) > 0
OR s.student_name LIKE 'test'

【讨论】:

  • @rupinder18 我已经更新了我的答案也请在下次发布错误详情
  • 现在正在执行查询,没有任何错误,但我得到了 tblhomework 的所有行,就像我搜索'shina rana'而不是测试,但我没有得到想要的结果
  • @rupinder18 在sqlfiddle.com 发布一些包含您的表定义的示例数据,并在此处提供 sql fiddle 链接
  • kickstart 提供的上述查询工作正常,只需要一个带有学生姓名的附加字段,而不是 select 中的学生代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多