2012-11-01 2 views
0

나는 내가하고 싶은 무엇MySQL의 쿼리 리그 순위

id season match_day host guest time host_score guest_score forfait mvp 
1 1 1 3 4 NULL 10 2 NULL 43 
2 1 1 5 6 NULL 2 2 NULL 16 
3 1 1 9 10 NULL 6 3 NULL 49 
4 1 1 2 1 NULL 5 5 NULL 29 
5 1 1 7 8 NULL 4 2 NULL 52 
6 1 2 1 4 NULL 7 3 NULL 75 
.... 

쿼리를 만드는 것입니다 이러한

id name abbr_name badge slogan captain 
1 TEAM1 TM1  NULL NULL NULL 
2 TEAM2 TM2  NULL NULL NULL 
3 TAEM3 TM3  NULL NULL NULL 
4 TEAM4 TM4  NULL NULL NULL 
5 TEAM5 TM5  NULL NULL NULL 
.... 

일치 항목과 같이 두 개의 MySQL의 테이블이 압축을 풀려면 모든 행에 값을 줄 수 있습니다.

Team_Id, Team_name, Team_N_Match_Played, Team_N_Match_Won, Team_N_Match_Lost 

PHP로 모든 데이터를 조작하지 않고 대신 MySQL 쿼리를 직접 사용할 수 있습니까? MySQL에서 어떻게 그럴 수 있는지 잘 모르겠습니다.

+0

당신은 팀의 값에 일치의 값에 가입해야합니다 dc_teams 것이다. 나는 호스트와 손님이 팀 테이블의 가치라고 생각합니까? –

+0

그렇다면 두 테이블을 결합 할 수있는 변수가 있어야합니다. 그런 다음 왼쪽 조인을 사용하여 함께 참여할 수 있으며 해당 팀에 대한 데이터가없는 경우 팀 데이터는 null이됩니다. –

+0

팀이 연결되어 있거나 forfiet가 null이 아닌 경우 어떻게 처리합니까? 색인에서 –

답변

0

MatchEntries = dc_match 팀을 =

SELECT 
    team_id, 
    name, 
    SUM(P) AS played, 
    SUM(W) AS won, 
    SUM(D) AS draw, 
    SUM(L) AS lost, 
    SUM(PTS) AS points 
FROM(
    SELECT 
     host team_id, 
     CASE 
      WHEN host_score IS NULL THEN 0 
      ELSE 1 
     END P, 
     IF (host_score > guest_score,1,0) W, 
     IF (host_score = guest_score,1,0) D, 
     IF (host_score < guest_score,1,0) L, 
     CASE 
      WHEN host_score > guest_score THEN 3 
      WHEN host_score = guest_score THEN 1 
      ELSE 0 
     END PTS 
    FROM dc_match 

    UNION ALL 

    SELECT 
     guest team_id, 
     CASE 
      WHEN guest_score IS NULL THEN 0 
      ELSE 1 
     END P, 
     IF (guest_score > host_score,1,0) W, 
     IF (guest_score = host_score,1,0) D, 
     IF (guest_score < host_score,1,0) L, 
     CASE 
      WHEN guest_score > host_score THEN 3 
      WHEN guest_score = host_score THEN 1 
      ELSE 0 
     END PTS 
    FROM dc_match 
    ) AS RNK 
LEFT JOIN dc_team t 
    ON RNK.team_id = t.id 
GROUP by team_id 
ORDER BY points DESC 
1

Count을 사용하십시오. 이 같은

SELECT 
    t.Team_Id, t.Team_name, 
    COUNT(meh.id) + COUNT(meg.id) AS Team_N_Match_Played, 
    COUNT(meh.host_scrore > meh.guest_score) + COUNT(meg.guest_score > meg.host_scrore) AS Team_N_Match_Won, 
    Team_N_Match_Lost 
COUNT(meh.host_scrore < meh.guest_score) + COUNT(meg.guest_score < meg.host_scrore) 
FROM Teams AS t 
JOIN Match_Entries AS meh ON t.id = meh.host 
JOIN Match_Entries AS meg ON t.id = meg.guest 
0

뭔가가

SELECT Teams.id, Teams.name, COUNT(a.id) + COUNT(d.id) + COUNT(c.id) + COUNT(f.id) + COUNT(b.id) + COUNT(e.id) AS GamesCnt, COUNT(a.id) + COUNT(d.id) AS GamesWon, COUNT(c.id) + COUNT(f.id) AS GamesLost, COUNT(b.id) + COUNT(e.id) AS GamesDrawn 
FROM Teams 
LEFT OUTER JOIN MatchEntries a ON Teams.id = a.host AND a.host_score > a.guest_score 
LEFT OUTER JOIN MatchEntries b ON Teams.id = b.host AND b.host_score = b.guest_score 
LEFT OUTER JOIN MatchEntries c ON Teams.id = c.host AND c.host_score < c.guest_score 
LEFT OUTER JOIN MatchEntries d ON Teams.id = d.guest AND d.guest_score > d.host_score 
LEFT OUTER JOIN MatchEntries e ON Teams.id = e.guest AND e.guest_score = e.host_score 
LEFT OUTER JOIN MatchEntries f ON Teams.id = f.guest AND f.guest_score < f.host_score 
GROUP BY Teams.id