2012-04-26 4 views
0

이것은 다소 복잡한 쿼리이지만, 나는 스누커 매치의 데이터베이스를 가지고 있으며 누가 가장 많은 결정 프레임을 플레이하고 이겼는지에 대한 통계를 생성하려고합니다 (규칙에 대해 걱정하지 마십시오. 당신이 게임을 모르는 경우).여러 열에서 DISTINCT를 선택하십시오.

테이블 : 나는 여러 열을 지원하지 않습니다 DISTINCT 생각으로

SELECT COUNT(*) AS played, DISTINCT(player1,player2) AS playerID 
FROM matches 
WHERE (player1Score=BestOf/2 + 0.5 AND player2Score=BestOf/2 - 0.5) 
GROUP BY playerID 

위의 쿼리가 작동하지 않습니다 :

ID player1 player2 bestOf  player1Score  player2Score 
1 1   2   9   5     0 
2 2   1   9   5     4 
3 1   2   9   5     4 
4 2   1   9   4     5 

내가 뭘하려고하면 다음과 같은 것이있다 . 내가 맨 테이블을 찾고 있어요 결과는 다음과 같습니다 그것이 마지막 프레임 아니므로

playerID played won 
1   3  2 
2   3  1 

테이블의 맨 위 행은 표시되지 않습니다.

SELECT GROUP(player1,player2) 
SELECT player1 + player2 AS playerID, select DISTINCT(playerID) 
SELECT (player1 + player2) AS playerID GROUP BY playerID 

좋은 몇 가지 다른 :

I는 다음과 같은 변화를 시도했다. 어떤 힌트를 주시면 감사하겠습니다!

+0

당신은 가능성이') (CONCAT'을 찾고 있습니다를 얻기 위해이 두 테이블을 결합 -functions.html # function_concat – Interrobang

+1

흠 .. 불쾌한 디자인. 데이터베이스 정규화를 배우십시오. 걱정하지 마세요, [정규식] (http://twitter.com/#!/shanselman/status/190543146323685377)이 아니기 때문에 매우 쉽게 배울 수 있습니다 :-) –

+0

플레이어 1과 플레이어가 어떻게 플레이 할 수 있습니까? 오직 세 게임. 샘플 데이터에 따르면, 그들은 4 경기 출전 한 것으로 보인다. 플레이어 1은 3 게임을 얻었고 플레이어 2는 1 게임을 얻었습니다. –

답변

0

내 테이블에는 구문 오류가 많을 수 있으므로 실제로 나와 테이블을 갖고 있지 않습니다. 그러나 잘하면 나는 전반적인 아이디어를 얻을 것입니다. player1이있는 프레임 게임 결정 목록을 계산하여 player2가 결정한 프레임 게임 목록과 조합 할 수 있습니다. 우승자의 열 이름을 동일한 문자열 ('player')로 변경하는 한이 테이블의 합집합은 각 사람이 얻은 횟수를 나타내는 단일 테이블을 만들어야합니다.

select player, count(*) as num_won from ((select player1 as player from matches where player1Score - player2Score = 1) union (select player2 as player from matches where player2Score - player1Score = 1)); 

이것은 각 플레이어의 ID와이긴 횟수에 대한 매핑을 제공해야합니다.

그런 다음 각 플레이어가 경기를 결정하는 프레임 게임의 수를 발견 할 수 있도록한다

select player, count(*) as num_played from ((select player1 as player from matches where abs(player1Score - player2Score) = 1) union (select player2 as player from matches where abs(player2Score - player1Score) = 1)); 

복근 기능의 사용을 고려한다. http://dev.mysql.com/doc/refman/5.5/en/string : 이제 우리는 당신의 최종 답변

select players_table.player, players_table.num_played, winners_table.num_won from (select player, count(*) as num_won from ((select player1 as player from matches where player1Score - player2Score = 1) union (select player2 as player from matches where player2Score - player1Score = 1)) winners_table), (select player, count(*) as num_played from ((select player1 as player from matches where abs(player1Score - player2Score) = 1) union (select player2 as player from matches where abs(player2Score - player1Score) = 1)) players_table) where winners_table.player == players_table.player; 
+0

나는 이것을 시도했지만 파생 테이블 오류가 발생했습니다. 이것에 대해 살펴 보겠습니다. 감사! – user1105971

+0

오류를 복사하여 붙여 넣기 할 수 있습니까? 만든 모든 중간 테이블에 별칭을 지정 했습니까? –

+0

나는 그렇지 않다. 오류는 "# 1248 - 모든 파생 테이블에는 고유 한 별칭이 있어야한다"입니다. 나는 별칭에 익숙하지 않은데, 나는 구글을 둘러보고, 어떻게 작동시키고 다시 당신에게 돌아갈지를 알아 낸다. 감사! – user1105971

0
create table temp_score 
select playerid, count(*) as won 
FROM(
    Select case when player1score > player2score then player1 else player2 end as playerid 
    from score 
    where 
    (player2Score=Round(BestOf/2 + 0.5,0) AND player1Score=round(BestOf/2 - 0.5,0)) 
    or 
    (player1Score=Round(BestOf/2 + 0.5,0) AND player2Score=round(BestOf/2 - 0.5,0)) 
) a 
group by playerid 

Select playerid,won, (Select SUM(won) from temp_score) as TotalPlayed from temp_score 
+0

하나의 쿼리에서이 작업을 수행하는 모습이 마음에 들지만 MySQL에서 Score_Cte를 실제 테이블 이름으로 바꾸어 테스트 한 결과 오류가 발생합니다. "# 1064 - SQL 구문에 오류가있어서 해당 설명서를 확인하십시오. 올바른 구문이 근처의 일치 항목을 사용하기위한 MySQL 서버 버전과 일치합니다. (playerid를 선택하고, COUNT (*)를 다음과 같이 계산합니다 ('1 번 라인에서'를 선택하십시오.) – user1105971

+0

이 답변은 MS Sql과 관련이 있습니다. 내부 결과를 테이블에 저장 한 다음 임시 테이블에서 두 번째 쿼리를 실행하여 최종 결과를 얻으십시오. –

+0

MySQL은 내가 아는 한 CTE가 없습니다. – vyegorov

관련 문제