2013-06-13 2 views
1

그래서 일부 myVIS 데이터베이스에 CSV 값이 저장되어 있습니다. 예를 들어mySQL에서 CSV 값 받기

:

SELECT * FROM `table` WHERE `parentID` LIKE %4% 

만 데이브가 반환됩니다이 쿼리를 사용하여

ID Name  parentID 
1  Dave  1,4,6 
2  Josh  2 
3  Pete  10 
4  Andy  2,10 

이 올바른 것입니다. 그러나 LIKE % 1 %를 사용하여 선택하면 pete와 andy가 dave와 함께 선택됩니다. 왜냐하면 그들은 '1'을 구성하기 때문입니다.

예를 들어 '1'과 '10'을 구분할 수 있도록 쿼리가 필요합니다. 쉼표 사이에있는 각 값을 확인해야하며 마지막 쉼표를 생략 할 수 있습니다.

아마 REGEX가 대신 할 수 있을까?

감사합니다.

+3

입니다. 실제 비 배심원 전용 방법은 CSV 값을 저장하지 않는 것입니다. 관계형 데이터베이스. ID가 parentID의 – Nanne

+0

과 일치하는 테이블 만들기 컨텍스트는이 테이블의 parentID 값이며 다른 테이블의 기본 ID를 참조합니다. –

+0

그러면 다른 데이터베이스 구성표가 필요하다는 것을 더욱 분명하게 알 수 있습니다! – Nanne

답변

3

당신은 "단어 경계"와 일치하는 정규 표현식을 사용할 수 있습니다

WHERE parentID RLIKE '[[:<:]]4[[:>:]]' 

을 또는 당신은 령 어 구분 된 문자열의 요소를 구문 분석하는 특별한 기능을 사용할 수 있습니다

WHERE FIND_IN_SET('4', parentID) <> 0 

을 @ Nanne의 의견에 동의합니다.

쉼표로 구분 된 목록이 아닌 정규화 된 방식으로 데이터를 저장하는 것이 좋습니다. 현재 스키마를 변경할 수있는 자유가 있는지는 모르지만 질문에 대한 대답은 Is storing a delimited list in a database column really that bad?

+0

감사합니다. FIND_IN_SET()은 완벽한 구현이었습니다 –

+0

@ BillyJakeO'Connor이 답변에 표시하고 싶습니까? –