我在表格中有一个名为student_id
的列,我在该列中存储与特定记录关联的学生ID,并使用|
字符进行分隔。下面是该列中的数据的一对夫妇的样本条目:MySQL:LIKE查询帮助?
243|244|245
245|1013|289|1012
549|1097|1098|245|1099
我需要编写的SQL查询将返回拥有的'245 student_id
记录。任何帮助将不胜感激。
我在表格中有一个名为student_id
的列,我在该列中存储与特定记录关联的学生ID,并使用|
字符进行分隔。下面是该列中的数据的一对夫妇的样本条目:MySQL:LIKE查询帮助?
243|244|245
245|1013|289|1012
549|1097|1098|245|1099
我需要编写的SQL查询将返回拥有的'245 student_id
记录。任何帮助将不胜感激。
不要在student_id
字段中存储多个值,因为每个行和列交叉点只有一个值是First Normal Form的要求。这是一件好事,原因很多,但很明显的一点是,它决定必须处理诸如“1245
”的student_id
这样的情况。
相反,最好有一个单独的表来存储与此表中记录相关的学生ID。例如(你要正确的约束条件添加到该表定义为好),
CREATE TABLE mytable_student_id (
mytable_id INTEGER,
student_id INTEGER
);
然后你就可以查询使用连接:
SELECT * FROM mytable JOIN mytable_student_id
ON (mytable.id=mytable_student_id.mytable_id) WHERE mytable_student_id.student_id = 245
注意,因为你没有张贴除了它包含一个student_id
字段以外,关于您的原始表的任何模式详细信息,我将其称为mytable
用于此示例(假设它具有名为id
的主键字段 - 具有主键是1NF的另一个要求)。
@Donut关于第一范式是完全正确的:如果你有一对多的关系,你应该使用一个单独的表,其他解决方案会导致ad hoc和不可维护的代码。
但如果你面对的是实际上存储这样的数据,这样做的一个常用的方法是这样的:
WHERE CONCAT('|',student_id,'|') LIKE '%|245|%'
同样,我用甜甜圈同意,但这是正确的如果您现在无法对数据执行任何操作,请使用查询。
WHERE student_id like '%|245|%' or student_id like '%|245' or student_id like '245|%'
这照顾245位于字符串的开始,中间或结尾。但是,如果你没有坚持这种设计,请按照甜甜圈的建议。
我认为应该是'WHERE mytable_student_id.student_id = 245' – LHMathies 2011-03-06 09:07:34