2009-11-25 8 views
0

그래서 테이블이 두 개 있습니다 : -char (플레이어에 대한 정보를 유지) -special (상위 mobs에 대한 계급이므로이 테이블의 각 줄은 모든MySQL - 어떤 JOIN을 사용해야합니까? 2 테이블, 회원 수가 동일하지 않습니다

################## 
## table char: ## 
################# 
`char_id` - int(12) auto increment - primary key 
`type` - varchar(18) 
`color` - varchar(16) 
--------------------------------------------------- 
##################### 
## table special: ## 
##################### 
`id` - auto increment - primary key - just for keeping a number of events 
`name` - varchar(24) 
`time` - int(12) - the time the char's spent to kill the mob 
`member1_id`- here is the char_id, it goes from 1 to 20 (until member20_id) 
its a int(12), default is '0', so if there's only 3 members i would have something like: 
`member1_id` = 1111111 
`member2_id` = 2222222 
`member3_id` = 1113123 
`member4_id` = 0 (same for the rest) 
--------------------------------------------------- 

내가 member1_id에서 모든 문자를 표시하려면, member2_id, memberN_id은 (알림 : 군중과 총 시간)

여기에 내가 쓴 요약입니다 죽인 플레이어 일부 값은 MEMBER_ID에 0이 플레이어가 없으므로 표시 할 데이터가 없음) 및 시간별 주문

여기 예제 :

Mob rank: 

1 - Name: XYZ Guild - Time: 3 minutes 
Member 1: 1111111 - Type: soldier - Color: blue 
Member 2: 2222222 - Type: soldier - Color: red 

2- Name: The FOO Guild - Time: 19 minutes 
Member 1: 238381 - Type: Noob - Color: green 
Member 2: 4444444 - Type: soldier - Color: red 
Member 3: 549595 - Type: soldier - Color: green 

MEMBER_ID는 순서의 시간에 의해도 0이 어디서 난 단지에서 데이터를 얻을 수있는 방법의 혼란처럼, 내가 사용해야 메신저 종류의 가입 유형에 대한 중요한 것은 자신을 특별

고맙습니다.

답변

0

데이터베이스 디자인에 문제가 있습니다. 테이블 "special"은 두 테이블, "special"및 "special_members"이어야합니다. "Special"에는 "id", "name"및 "time"열이 있어야합니다. "Special_members"에는 "special_id", "member_id"및 선택적으로 "member_order"열 (숫자 1, 2 등이 중요한 사람) 및 "id"자동 열이 있어야합니다.

이 정규화 된 구조를 사용하면 쿼리가 쉬워집니다.

정규화가 없으면 INNER JOIN을 20 회 반복하고 UNION을 사용해야합니다.

+0

그럼 LEFT JOIN을 사용하겠습니까? 스크립트를 만들 수는 있지만 같은 ID에 대해 전체 special_members를 검색해야하기 때문에 비용이 많이 들거나 느려지지 않을 것입니다. –

+0

정규화 된 구조를 사용하면 세 개의 테이블 (char, special, special_members)과 INNER JOIN (또는 단순한 JOIN)을 모두 연결하여 사용할 수 있습니다. 이것은 가장 쉽고 빠르며 가장 올바른 방법입니다. JOINed 필드에 인덱스가있는 한 빨리 처리 할 수 ​​있습니다. 정규화하지 않으면 여전히 두 테이블간에 INNER JOIN을 사용하지만 쿼리를 20 번 반복해야합니다. 다른 테이블을 추가하면 21 번, 다른 테이블을 추가하면 22 번 반복해야합니다. UNION을 사용하여 20 개의 쿼리를 하나로 분리합니다. 또한 0 대신 NULL을 사용해야합니다. –

0

테이블 구조를 재고해야한다고 생각합니다. member_1, member_2, member_3, member_4가 있으면 장기적으로 더 많은 문제가 발생할 것입니다. 특히 데이터를 연결하려고 할 때.

나는 그것이 당신이 chars 테이블을 가지고 있다고 제안 할 것이다.

"특수"테이블을 유지하고 멤버를 고유 한 테이블로 이동하고 id로 특수 테이블과 연결하십시오.

때문에 회원 여러분은 이제 가입 내부를 사용하고 당신이 원하는 모든 데이터를 얻을 수 있습니다

special_id, 회원

이있을 것이다.

+0

좋아, 시도해 보려합니다. 래리도 나에게도 똑같이 조언합니다. 덕분에 ! –

관련 문제