2010-12-15 137 views
0

我在表格中有一个名为student_id的列,我在该列中存储与特定记录关联的学生ID,并使用|字符进行分隔。下面是该列中的数据的一对夫妇的样本条目:MySQL:LIKE查询帮助?

243|244|245 
245|1013|289|1012 
549|1097|1098|245|1099 

我需要编写的SQL查询将返回拥有的'245 student_id记录。任何帮助将不胜感激。

回答

4

不要在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的另一个要求)。

+0

我认为应该是'WHERE mytable_student_id.student_id = 245' – LHMathies 2011-03-06 09:07:34

0

@Donut关于第一范式是完全正确的:如果你有一对多的关系,你应该使用一个单独的表,其他解决方案会导致ad hoc和不可维护的代码。

但如果你面对的是实际上存储这样的数据,这样做的一个常用的方法是这样的:

WHERE CONCAT('|',student_id,'|') LIKE '%|245|%'

0

同样,我用甜甜圈同意,但这是正确的如果您现在无法对数据执行任何操作,请使用查询。

WHERE student_id like '%|245|%' or student_id like '%|245' or student_id like '245|%' 

这照顾245位于字符串的开始,中间或结尾。但是,如果你没有坚持这种设计,请按照甜甜圈的建议。