2014-09-30 1 views
0

하나의 필드에서 다른 행의 값을 검색해야하는 두 개의 테이블이 있습니다. 행은 연결 문자열입니다. 이런 식으로 뭔가 :concat과 같은 SQL이 특정 값을 선택하지 않습니다.

표 :

|id|Name |Itemsid | 
|1 |John |1  | 
|2 |Hans |4, 22, 23| 
|3 |Chris|2, 4, | 
|4 |Jorn |4, 22, 23| 
|5 |Claus|1, 4, 23 | 
|6 |Marco|22, 4 | 

표 2 :

|id |item  | 
|1 |Mobile  | 
|2 |Creditcard | 
|3 |Wallet  | 
|4 |Car  | 
|22 |House  | 
|23 |Boat  | 

예상 결과

4|Jorn|Car 
4|Jorn|House 
4|Jorn|Boat 

나는

SELECT * 
FROM Table1 
INNER JOIN Table2 ON Table1.itemsid LIKE CONCAT ('%', Table2.id, '%') 
WHERE Table1.name = Jorn 
시도

4|Jorn|Car 
4|Jorn|Creditcard 
4|Jorn|Wallet 
4|Jorn|House 
4|Jorn|Boat 

결과가

따라서 나는 regexp 그래서 내부는 것 가입 시도 :

SELECT * 
FROM Table1 
INNER JOIN Table2 ON Table1.itemsid REGEXP CONCAT ('(,|\s|^)', Table2.id, '(,|\s|$)') 
WHERE Table1.name = Jorn 

그래서 문제가 like concat를 사용

4|Jorn|Car 

의 결과로, 그것은 '아무튼이다 특정 값을 선택하고 ID가 22이면 2를 선택하십시오.

regexp의 문제는 첫 번째 ID 만 선택하고 목록을 검토하지 않는다는 것입니다.

그래서 예상 된 결과를 대신 제공 할 쿼리를 찾고 있습니다.

+1

데이터베이스 디자인이 좋지 않습니다. 다른 테이블에서 Itemsid 필드를 움직여야하고, 테이블 1과 2를 연결 한 후에야합니다. – faster2b

답변

1

구분 기호 문제가 있습니다.

SELECT * 
FROM Table1 INNER JOIN 
    Table2 
    ON concat(', ', Table1.itemsid, ', ') LIKE CONCAT ('%, ', Table2.id, ', %') 
WHERE Table1.name = 'Jorn'; 

그러나 실제로는 접합점 테이블을 사용해야합니다. 정수리스트를 문자열에 저장하는 것은 나쁜 생각입니다. SQL은리스트를 저장하기위한 훌륭한 구조를 가지고있다. 문자열이 아니라 테이블이라고합니다.

+0

고마워 .. (지금) 나는 그것에 대해 읽은 후, 그것을 지적 해 준 덕분에 접합 테이블을해야한다는 것을 안다! – bumbum

관련 문제