2011-02-05 2 views
0

이 SQL 쿼리의 목표는 가장 많은 승리를 얻은 사용자와 승리 한 횟수를 반환하는 것입니다.이 논리에 대한 SQL 쿼리를 작성하는 방법 (has_many, belongs_to association)?

나는 두 개의 테이블을 가지고 있습니다 : 사용자와 경기. (FK USER_ID)

  • challenger_id (FK user_id를)
  • challengee_id
  • challenger_won (부울 :

    사용자가 많은 싸움이 사용자에게 속한 싸움을

    싸움 우려의 다음과 같은 열이있다)

사용자가 볼 수있는 것처럼 도전자 또는 도전자, 그러나 둘 다 아닙니다.

  • 사용자가 도전자이고 challenger_won = true이면 승리로 간주됩니다.
  • 사용자가 challengee이고 challenger_won = false 인 경우, 이는 승리로 간주됩니다.
  • challenger_won = null 인 경우 무시하십시오.

어떻게이 SQL을 작성할 수 있습니까?

답변

3

어떨까요? challenger_won가 NULL

SELECT a.fighter, COUNT(*) AS wins 
    FROM (SELECT challenger_id AS fighter 
      FROM fights 
     WHERE challenger_won = TRUE 
     UNION ALL 
     SELECT challengee_id AS fighter 
      FROM fights 
     WHERE challenger_won = FALSE 
     ) AS a 
GROUP BY a.fighter; 

경우 필요에 따라 UNION에서 두 쿼리는 행을 무시합니다. 당신이 ALL UNION 마음에 들지 않으면

대신 사용할 수 있습니다 :

SELECT a.fighter, SUM(a.wins) AS wins 
    FROM (SELECT challenger_id AS fighter, 'R' AS role, COUNT(*) AS wins 
      FROM fights 
     WHERE challenger_won = TRUE 
     GROUP BY fighter, role 
     UNION 
     SELECT challengee_id AS fighter, 'E' AS role, COUNT(*) AS wins 
      FROM fights 
     WHERE challenger_won = FALSE 
     GROUP BY fighter, role 
     ) AS a 
GROUP BY a.fighter; 

연합의 첫 번째 부분은 역할로 'R'에 열을 생성 (위해 '도전자 원')과 전투기 신분증과 싸우는 횟수를 계산합니다. 두 번째 부분에서는 'E'를 역할로 ('challengeE won'의 경우) 행으로 생성하고 전투기 ID와 전투에서 얻은 수를 계산합니다. 도전자로 3 싸움과 도전자로 3 시합을 얻은 경우에는 역할이 필요합니다. 역할이 없으면 같은 전투기와 카운트를 가진 두 개의 엔트리가 하나로 통합됩니다. 그런 다음 각 역할에서 각 전투기의 승리를 합산합니다.

+0

첫 번째 쿼리를 실행할 때 "모든 파생 테이블에 고유 한 별칭이 있어야합니다"라는 오류가 발생합니다. – keruilin

+0

@keruilin : 유죄로 청구 됨 - 누락 된 'AS a'절을 추가했습니다 (' AS b '대신 알 수없는 테이블/별칭'a '오류가 발생합니다. 코드를 실행하지 않았습니다. 알 수 있듯이. –

관련 문제