2013-09-16 5 views
2

저는 일대 다 관계를 유지하고있는 MySQL 테이블을 가지고 있습니다. 표는 foosball 통계 프로그램에 대한 파트너 목록을 저장하는 것입니다. 플레이어는 0, 1 또는 2 명의 파트너를 가질 수 있습니다. 예를 들어일대 다 검색 쿼리

:

___________________________________ 
| Table index | Partners | Players | 
|  1  |  1 | John | - Singles, no partners 
|  2  |  2 | John | - Doubles, John and Bob 
|  3  |  2 | Bob | - Doubles, John and Bob 
|  4  |  3 | Dave | - Roto doubles, Dave, Bob, John 
|  5  |  3 | Bob | - Roto doubles, Dave, Bob, John 
|  6  |  3 | John | - Roto doubles, Dave, Bob, John 
|  7  |  4 | Dave | - Singles, no partners 
____________________________________ 

나는 테이블에서 파트너를 추가하고 검색 할 PHP 스크립트를 쓰고 있어요 및 내 쿼리에 문제가 있어요. 나는 선수를 알고 파트너 필드를 검색하려고합니다. 수행해야 할 세 가지 질문이 있습니다.

  • 파트너 없음 - 수표;
  • 특정 파트너 확인 - "Dave"와 배정.
  • 두 특정 파트너 확인 - "Bob and Dave"와 복식;

항목이 있으면 그것을 검색하고 싶습니다. 그런 다음 해당 항목을 표에 추가합니다. 내가 가진 문제 중 하나는 예를 들어, 플레이어 "John"이 세 개의 항목, 파트너 없음, 파트너 한 명 및 파트너 2 명을 포함합니다. 엔트리 1 만 빼고 2 나 6을 빼는 방법은 어떻게 지정합니까?

여기를 검색해 보았지만 내가 필요로하는 것이 아닌 가까운 두 가지 예제를 발견했습니다. 이 하나의 mySQL: Querying one-to-many -table?은 내가 필요한 것을 거의 수행하지만 꽤하지는 않습니다.

도움을 주시면 감사하겠습니다.

크리스

+1

4 명의 파트너 인 마지막 행이 "싱글을 파트너로 사용하지 않음"을 의미하는 이유는 무엇입니까? – Blazemonger

+3

파생 정보 만 보관하고 있습니다. 유지 보수가 어려울 수 있습니다. 누구와도 파트너 관계를 맺고있는 정보를 입력 할 필요가 없습니까? 이 경우 파트너 관계 테이블을 유지하고 쿼리를 통해 플레이어 당 파트너 수를 유도하십시오. – reinierpost

+0

죄송합니다. 열 제목 "partners"의 이름이 "partnerID"인 것이 좋습니다. 주어진 개인이 가진 파트너의 수가 아니라 파트너 관계를 나타내는 지수입니다. 저의 원래 게시물은 오해의 소지가 있습니다. – vrstud

답변

0

내가 제대로 파트너 필드가 암시 적 그룹 테이블에 외래 키 실제로 스키마 이해한다면 (그것은 더 나은 테이블라는 팀에 TeamId 키를 이름을 지정해야합니다 즉 어디 각 행은 하나 개의 협력 관계를 나타냄) .

우리가 제대로 작동 할 수 있도록 전체 스키마를 정의 해 봅시다 (이것은 본질적으로 테이블과 같지만 비정규 화되어 더 명확 해집니다. 동일한 플레이어가 다른 플레이어를 허용하는 이름 대신 PlayerId를 사용할 수도 있습니다). 이름). 여기에있는 다 대다 커넥터 테이블은 PlayerTeam입니다.

enter image description here

우리가 얻을 수있는 TeamId의이 쿼리

SELECT TeamId, count(PlayerId) as TeamSize 
FROM PlayerTeam 
WHERE TeamId IN (SELECT TeamId FROM PlayerTeam WHERE PlayerId = *your-player-id*) 
GROUP BY TeamId 

를 실행 그리고 당신은 HAVING 절에 추가하여 특정 크기의 팀을 얻을 수에 의해 주어진 플레이어의 팀 크기 :

SELECT TeamId, count(PlayerId) as TeamSize 
FROM PlayerTeam 
WHERE TeamId IN (SELECT TeamId FROM PlayerTeam WHERE PlayerId = *your-player-id*) 
GROUP BY TeamId 
HAVING TeamSize = 2 

다음 쿼리를 사용하여 플레이어 당 한 번 쿼리하지 않아도됩니다.

SELECT p.Name, p.PlayerId, pt.TeamId, sz.TeamSize 
FROM Player p JOIN PlayerTeam pt USING(PlayerId) 
    JOIN (SELECT TeamId, count(PlayerId) as TeamSize 
     FROM PlayerTeam GROUP BY TeamId) AS sz USING(TeamId) 

그러나이 마지막 항목을 효과적으로 사용하려면 편리하게 색인화 된 연관 배열 (예 : $team[UserId][TeamSize] => TeamId)을 준비하여 결정을 내리는 것이 좋습니다.

+0

스키마가 거의 정확합니다. 플레이어 이름에 대한 별도의 테이블이 있으며 PlayerTeam 테이블에서 해당 인덱스를 사용합니다. TEAM 테이블이이 쿼리와 관련이 있다고 생각하지 않습니다. 쿼리는 내가 찾고있는 것입니다. 내가 3 명 또는 3 명 모두의 정보를 알고 있다면 다른 하나가 될 것입니다. 첫 번째와 두 번째 쿼리의 WHERE 옵션을 확장해야한다고 생각하겠습니까? – vrstud

+0

네가 맞다. 팀 테이블이 사용되지 않는다. 다 대다 직감에 도움이되기 때문에 나는 그 테이블을 사용한다. 예, 하위 쿼리가있는 다른 IN 절을 사용하면 둘 이상의 팀 구성원을 지정할 수 있습니다. '... TeamId IN (TeamId는 어디에서 선택합니까? PlayerId = id1) 및 TeamId IN (TeamId는 PlayerTeam에서 PlayerId = id2로 SELECT) ... '. 그러나 그것이 얼마나 효과적 일지에 대해서는 확신 할 수 없지만 나중에 문제가된다면 그것을 해결할 수 있습니다. –

+0

감사합니다. 쿼리를 완벽하게 처리 할 수있었습니다. 추가 플레이어 ID 확인에 추가하면 큰 효과가있었습니다. – vrstud