MySQL:LIKE查询帮助?

时间:2010-12-15 17:21:18

标签: mysql

我的表中有一个名为student_id的列,我存储与该列中特定记录关联的学生ID,并以|字符分隔。以下是该列中数据的几个示例条目:

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

我需要编写一个SQL查询,它将返回student_id为245的记录。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:4)

不要在student_id字段中存储多个值,因为每行只有一个值,并且列交集是First Normal Form的要求。出于多种原因,这是一件好事,但显而易见的是,它解决了必须处理student_id1245”等案件的问题。

相反,最好有一个单独的表来存储与此表中的记录关联的学生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的另一个要求。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

同样,我同意Donut,但如果您暂时无法对数据做任何事情,这是正确的查询。

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

这将处理245位于字符串的开头,中间或末尾。但是,如果你没有坚持这个设计,请,请做Donut推荐的。