2013-05-23 2 views
2

나는 각 팀마다 판타지 풋볼 매니저와 15 명의 플레이어 데이터베이스를 가지고 있습니다. 나는 "Robin Van Persie"가있는 팀을 모두 나열하기 위해 다음을 할 수 있습니다.데이터베이스의 모든 고유 값에 대한 합계를 구하십시오.

SELECT * 
FROM `players` 
WHERE MATCH(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) 
AGAINST ('Robin Van Persie' IN BOOLEAN MODE) 

그리고 나는 얼마나 많은 사람들이 "로빈 판 퍼시 (Robin Van Persie)"를 가지고 있는지를 계산할 수 있습니다 (숫자 만 반환).

SELECT count(*) 
FROM `players` 
WHERE MATCH(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) 
AGAINST ('Robin Van Persie' IN BOOLEAN MODE) 

그러나 이와 비슷한 목록을 얻을 수있는 방법이 있습니까?

Count | Player Name 
------------------------- 
62 | Robin Van Persie 
12 | Wayne Rooney 
22 | Michu 
31 | Theo Walcott 

데이터베이스의 각 고유 값에 대해?

+4

먼저 모든 플레이어가 열 대신 자신의 행을 갖도록 데이터베이스를 표준화해야합니다. –

+0

정규화를 한 번도 한 적이 없지만이 데이터베이스에서는 순서가 중요합니다. 예를 들어, p1-p11은 실제 팀이며 p12-p15는 잠수함입니다. 정상화가 엉망이 될까요? 도움이된다면 별도의 플레이어 이름을 가진 데이터베이스가 있습니다. – Cully

+1

그런 다음 각 플레이어에 대해 색인을 추가하십시오. –

답변

1

정말 세 개의 테이블이 필요합니다. 기본 ID 및 모든 선수 목록 :

은 "선수"테이블에서
표 1, 당신은이 열을 가지고있다.

표 2
은 "관리자"테이블도 2 열이 있습니다 각 관리자 이름 및 기본 이드.

표 3
은 "managers_players"표는 그녀 또는 그의 팀에 각 플레이어의 기본 ID와 각 관리자의 기본 ID를 연결합니다. 따라서 기술적으로이 테이블에는 테이블 기본 ID, 관리자 ID 및 플레이어 ID의 세 열이 있습니다. 따라서이 테이블에는 동일한 관리자 ID와 동일한 플레이어 ID의 여러 인스턴스가 있습니다.

이 구성에

, 당신은 (내부 조인의 "binarys"를 사용해야 할 수도 있습니다)이 같은 쿼리를 실행할 수 있습니다

SELECT m.name, count(mp.player_id) as count 
FROM managers_players mp 
inner join managers m 
on mp.manager_id = m.id 
inner join players p 
on p.id = mp.player_id 
group by m.id 
order by count DESC; 

이 스키마는 또한 정말 쉽게 각 선수를 볼 수 있도록 것 매니저 팀 :

SELECT p.name 
FROM managers_players mp 
inner join managers m 
on m.id = mp.manager_id 
inner join players p 
on p.id = mp.player id 
where m.name like '%Manager Name%'; 

또는 select m.name을하고 특정 플레이어가 모든 관리자를 볼 수 p.name에 where 절을 변경합니다.

+0

내가 예상했던 것보다 좀 더 복잡하게 들린다 ... 나는 이미 테이블 1과 테이블 2를 설정했다. 내 세 번째 테이블은 플레이어를위한 15 개의 기둥이있는이 소식의 상단에서 보는 바와 같습니다. – Cully

+0

위의 쿼리를 수행하고 데이터베이스의 모든 플레이어 이름에 대해 루프를 실행하는 간단한 작업을 실행할 수 있지만 실행하는 데 시간이 오래 걸립니다. 나는 당신의 제안을 살펴보고 가치있는 일인지를 살펴보고 잠시 시간을 들여 다시 정보를 얻으려고 할 것입니다. 제안 해 주셔서 감사합니다! – Cully

+1

그래도 실행하는 데 시간이 오래 걸릴 수 있지만 손실 된 순 시간은 내 제안을 구현하는 것보다 빠를 수도 있습니다. http : //www.xkcd.com/1205/중첩 된 조건이나 select 문을 사용하여 실험 해 볼 수 있습니다. 친구들과의 작은 일이라면, "충분히 좋은"해킹을 발견하고 스키마를 수정하는 데 시간을 들이지 않을 것입니다. 그러나 이것이 프로덕션 플랫폼을위한 것이라면, 분명히 더 많은 것을 추상화 할 것을 제안 할 것입니다 내가 제안한 스키마와 일치한다. – Dave

관련 문제