2012-08-08 4 views
0

두 테이블이 있는데 하나의 테이블에는 쉼표로 구분 된 다른 테이블에 포함 된 ID 목록과 함께 각 행에 정보가 있습니다. 지금 나는 표 A에서 쉼표로 구분 된 ID를 사용하여 데이터를 가져오고 있으며 표 B의 모든 데이터 (추가 정보가 들어있는 표)도 가져 오려고합니다. 가능한 가장 효율적인 SQL 방법으로 이것을하고 싶습니다.두 번째 테이블에 조인/서브 쿼리하는 방법

필드의 ID를 기반으로 표 A를 표 A와 결합하는 것에 대해 생각해 보았지만 가능한지 확실하지 않았습니다. 또 다른 IN 문을 기반으로 표 A의 데이터를 얻는 것이 중요하므로 궁극적 인 목표는 표 A의 행에서 필드에있는 ID에 따라 표 A의 행에 표 B의 모든 행을 첨부하는 것입니다 (행별로 행)

사람이이 모든 것을 따라 내가 샘플 쿼리 감사하겠습니다하려고 노력하고 알고 있던 경우 : 당신이 더 clarifaction이 필요하면 내가 그들을 제공 드리겠습니다 D

을 .

감사

방법 표 A는 설정은 지금 :

`table_b_id` VARCHAR (6) NOT NULL, 
`name` VARCHAR (128) NOT NULL, 
-- More data that is not relevant to the question 

이 또한 내가 원하는

결국 카산드라와 같은 NOSQL 시스템으로 전환 :

`table_a_id` VARCHAR (6) NOT NULL, 
`table_b_ids` TEXT NOT NULL, -- This is a comma seperated list at the moment 
-- More data here that is irrelevant to this question but i am grabbing 

테이블 B는 다음과 같이 설정되어 , 내가 간략하게 읽었던 것에서는 NOSQL에 조인과 같은 것이 없다는 것을 이해하고 있는가? 보너스 도움은 이러한 테이블을 설정하는 데 도움이 될 것이므로 적은 전환과 어려움으로 변환 할 수 있습니다.

+3

테이블에 쉼표로 구분 된 ID 목록이 저장되어 있습니까? 그것은 당신의 첫번째 실수입니다. 데이터를 표준화하면 이러한 유형의 쿼리 문제를 훨씬 쉽게 해결할 수 있습니다. http://en.wikipedia.org/wiki/Database_normalization – Madbreaks

+0

테이블 정의와 초기 쿼리가 좋을 것입니다. – favoretti

+0

http://dev.mysql.com/doc/refman/5.1/en/join.html - JOIN에 대해 알아야합니다. – Crontab

답변

3

에 가입 할 수 있습니다, 각각의 고유 ID에 대한 행을 저장하는 것입니다.

Person -- your Table A 
------ 
PersonID 

Thing -- your Table B 
------ 
ThingID 
ThingName 

PersonThing -- new intersection table 
------- 
PersonID 
ThingID 

그런 다음 쿼리는 당신이 다른 답변을 정상화 "는 무엇을 의미하는 것입니다

Person 
001 | Sam Spade 

Thing 
12 | box 
23 | chair 
14 | wheel 

PersonThing 
001 | 12 
001 | 23 
001 | 14 

것이다 그래서 당신은

001 | Sam Spade | 12,23,14 

이 어디

SELECT * from Person 
INNER JOIN PersonThing ON Person.PersonID = PersonThing.PersonID 
INNER JOIN Thing ON PersonThing.ThingID = Thing.ThingID 

된다 ". 내가 NoSQL에의 이해가 무엇에서

을 추가 할

편집, 당신은 주위에 얻을 것은 다음과 같이 조인

살아라 정보가 많은 복제하여 (여분의 공간을 차지하기위한 대가로
Person -- your Table A 
------ 
PersonID 
OtherPersonStuff 

Thing -- your Table B 
------ 
ThingID 
ThingName 
OtherThingStuff 


PersonThing -- denormalized table, one record for each Thing held by each Person 
------- 
PersonID 
ThingID 
ThingName 
OtherThingStuff 

시간) 및 잠재적 인 데이터 관리 문제 (중복 된 데이터 동기화 유지)를 통해보다 간단하고 빠른 쿼리를 작성할 수 있습니다.

그래서 마지막 테이블은 다음과 같이 보일 것이다 :

PersonThing 
001 | 12 | box | $2.00 
001 | 23 | chair | $3.00 
001 | 14 | wheel | $1.00 
002 | 12 | box | $2.00 
003 | 14 | wheel | $1.00 

을이 경우 OtherThingStuff이 물건의 값입니다.

+0

빨리 편집 할 수 있습니까? 그것은 많이 감사하겠습니다 :) 감사합니다 – MasterGberry

+0

감사합니다 :) 그것은 내가 많이 할 필요가 있다고 생각하지만, 다른 사람과 먼저 확인하고 싶었어요. – MasterGberry

2

조인을 사용하려면 데이터베이스 스키마를 정규화해야합니다. 쉼표로 구분 된 목록을 사용하면 SQL IN 명령을 사용할 수 없습니다.

그것을 할 수있는 가장 좋은 방법은 다음 당신은 다른 테이블을 추가 할 필요가 TableA.id = TableB.id

관련 문제