>source

데이터베이스에 2 개의 테이블이 있습니다. 하나는 'LEAGUES'이고 다른 하나는 'MATCHES'입니다. 나는 그 리그와 관련된 경기의 유리한 결과에 따라 각 리그의 승리 율을 얻고 싶습니다.

테이블의 구조 :

#######################  ###########################
#   TABLE LEAGUES     #  #       TABLE MATCHES     #
#######################  ########################### 
+----------+----------+  +-------------------------+ 
|    ID    |   name   |  |ID|match|League_id|Result|
+----------+----------+  +--+-----+---------+------+
|     1    |   aaa    |  |1 |xxxxx|    1    |  W   |
|     2    |   bbb    |  |2 |xxxxx|    1    |  L   |
|     3    |   ccc    |  |3 |xxxxx|    2    |  W   |
|     4    |   ddd    |  |4 |xxxxx|    3    |  W   |
+----------+----------+  |5 |xxxxx|    3    |  L   |
                         |6 |xxxxx|    3    |  W   |
                         +--+-----+---------+------+

내가 원하는 결과 :

#######################
#       RESULT        #
#######################
+----------+----------+  
|league.id | Winrate  | 
+----------+----------+
|     1    |   50%    |
|     2    |   100%   |
|     3    |   66%    | 
+----------+----------+

다음 코드를 시도했지만 하위 쿼리가 둘 이상의 값을 반환하기 때문에 작동하지 않습니다 :

SELECT leagues.id, COUNT(leagues.id)*100/(SELECT COUNT(leagues.id) 
                              FROM leagues,matches WHERE 
                              leagues.id=matches.League_id 
                              GROUP BY leagues.id) as winrate 
FROM leagues,matches
WHERE leagues.id=matches.League_id and matches.result like 'W'
GROUP BY leagues.id

이러한 결과를 얻는 다른 방법이 있습니까? 미리 감사드립니다.

  • 답변 # 1

    원하는 것 같습니다 :

    SELECT m.League_id,
           AVG( m.result = 'W' ) as winrate
    FROM matches m
    GROUP BY m.League_id;
    
    

    참고 사항 :

    당신은 leagues 가 필요하지 않습니다  필요한 필드가 matches 에 있기 때문에 테이블 .

    적절하고 명시적인표준 JOIN 배우기  구문 (이 쿼리에는 필요하지 않지만).

    MySQL은 숫자 컨텍스트에서 부울을 숫자로 처리합니다. true는 1, false는 0이므로 AVG( <boolean expression> )  참 값의 비율을 반환합니다. 꽤 근사하다.

    그들은 거의 같은 일을하지만 =   like 가 아닌 평등 비교에 더 일반적으로 사용됩니다. .

  • 이전 r - 히스토그램 채우기가 특정 빈의 모든 현재 수준을 나타내는 것은 아닙니다
  • 다음 python - 내 프로그램의 두 번째 스레드가 실행되고 있지 않습니다