2010-12-15 4 views
0

테이블에 student_id이라는 열이 있는데이 열의 특정 레코드와 연결된 학생 ID를 | 문자로 구분하여 저장하고 있습니다. 여기에 해당 열의 데이터의 몇 가지 샘플 항목은 다음과 같습니다MySQL : LIKE 쿼리 도움말?

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

내가 245 '의 student_id가 레코드를 반환하는 SQL 쿼리를 작성해야합니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

4

student_id 필드에 값을 여러 개 저장하지 마십시오. 각 행 및 열 교차에 정확히 하나의 값이 필요하므로 First Normal Form이 필요합니다. 이것은 여러 가지 이유로 좋은 일이지만 분명한 이유 중 하나는 student_id이 "1245"인 사례를 처리해야하는 문제를 해결한다는 것입니다.

대신이 테이블의 레코드와 연관된 학생 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

0

@Donut은 First Normal Form과 완전히 같습니다. 일대 다 관계가있는 경우 별도의 테이블을 사용해야하며, 다른 솔루션은 ad-hoccery 및 유지 보수가 불가능한 코드로 이어집니다. 나는 도넛에 동의, 다시

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

0

을, 그러나 이것은 적절한입니다 : 당신이 그런 식으로 저장된 사실에있는 데이터에 직면하는 경우

는하지만, 그 일을 한 일반적인 방법은 이것이다 현재 데이터에 대해 아무 것도 할 수없는 경우 사용할 쿼리입니다.

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

이렇게하면 문자열의 시작, 중간 또는 끝에 245 개가 처리됩니다. 그러나이 디자인을 고집하지 않으시면 Donut이 권장하는 것을하십시오.