2012-02-23 2 views
4

다음에서 선택한와 나는 BLOB와 회원 테이블이 다른 회원의 ID의 쉼표로 구분 된 목록을 포함하는 '연락처'필드 :MySQL은 내가 MySQL을 사용할 쉼표로 구분 된 필드

TABLE members: 
id_member = 1 
firstname = 'John' 
contacts (BLOB) = '4,6,7,2,5' 

나는 모든을 검색 할을 하나의 검색어로 개인의 '연락처'목록에있는 이름. 나는 다음과 같은 시도 :

SELECT firstname from members WHERE id_member IN (SELECT contacts FROM members WHERE id_member = 1); 

그것은 단지 하나 개의 행을 반환하지만 내가하려고하면

SELECT firstname from members WHERE id_member IN (4,6,7,2,5); 

이 목록에서 모든 첫 번째 이름을 반환합니다. 이것을 달성하기 위해 두 가지 쿼리를 사용할 수는 있지만 간단하고 우아한 쿼리 하나를 사용할 수있는 방법이 있는지 다시 한 번 확인해야한다고 생각했습니다.

도움을 주셔서 감사합니다. Jul

+0

문자열 당신의 ID가 숫자와 방울? – Jrod

+0

여기 해결책은'id_member'와'id_contact'라는 두 개의 열이있는 연락처 테이블을 사용하여 데이터베이스를 적절하게 표준화하는 것입니다.이 테이블에는'id_member' 당 여러 행이 있습니다. –

+0

예, Jrod, 제 ID는 INT이고 blob은 문자열입니다. 아이디어 마이클을 주셔서 감사합니다. 그러나 저는 Tadman의 대답에 대한 제 의견에 표현한이 옵션에 대한 예비가 있습니다. –

답변

2

이 DB 구조를 변경할 수 있습니까? 연락처 필드는 실제로 열이 아닌 관련 테이블이어야합니다. 이 구조와 연락처 테이블을 가정 :

id_contact 
id_member 

그런 다음 당신이 사용하는 것이

대신 존재합니다

SELECT firstname from members m WHERE EXISTS (SELECT 1 FROM contacts c WHERE c.id_contact = m.id_member); 
+0

그것은 좋은 검색어 다. 나는 관련 테이블에 갈거야. 너의 도움에 감사한다. –

5

매우 불쌍한 테이블 디자인처럼 보입니다. 그것을 바꿀 수 있습니까?

그런 다음 디자인을 변경할 수 없습니다 당신이 FIND_IN_SET를 사용하여 MySQL의에서 쉼표로 구분 된 값을 처리 할 수 ​​있지만, 효율적으로 인덱스를 사용할 수 없습니다 경우

SELECT firstname 
FROM members 
WHERE FIND_IN_SET(id_member, (SELECT contacts FROM members WHERE id_member = 1)) 

그러나 오히려이 길을가는 것보다, 나는 을 강력하게하면 가능하면 normalize your database을 추천한다. 쉼표로 구분 된 목록 대신 join table을 사용하십시오. 그런 다음 조인을 사용하여 필요한 항목을 찾을 수 있으며 검색은 색인을 사용할 수 있습니다.

+0

'FIND_IN_SET'에 대해 알지 못했지만, 결과적으로 커다란 데이터 세트에서 잔인하게 느려질 것입니다. 자동 테이블 스캔에서 인덱싱 할 수 없습니다. 그래도 깔끔한 트릭. – tadman

+0

연구 링크를 제공해 주셔서 감사합니다. 매우 도움이됩니다. 나는 정규화 된 데이터베이스에 대해 –

3

이 값을 저장하기 위해 일련 번호 BLOB 유형 열을 사용하는 경우 원하는 것을 수행 할 수 없습니다. SQL보다 친숙한 접근법은 값과 다른 값 사이의 연관을 갖는 member_contacts 테이블과 같은 JOIN 작업의 일부로 사용할 수있는 관계 테이블을 만드는 것입니다.

쉼표로 구분 된 목록을 개별 레코드로 확장하는 것은 매우 간단한 기계 과정입니다.

+0

답장을 보내 주셔서 감사합니다. 이 접근 방법을 고려했지만 단일 구성원의 연락처 목록을 수집한다는 아이디어는 모든 사람의 연락처 항목으로 채워진 표를 탐색해야하므로 비효율적이었습니다.더 빠르면 확실히 갈 것입니다. –

+0

'WHERE' 절에서 사용하고있는'id_member'에이 색인을 붙이면 큰 데이터 세트에서도 실제로 매우 빠릅니다. 빈번한 조회에는 항상 색인이 있어야합니다. – tadman

+0

고마워, 나는 그 일을 끝내었다. –