2012-08-15 3 views
2

저는 현재 순위가있는 점수를 가져 오는 데 사용하는 두 가지의 복잡한 쿼리를 사용하고 있습니다. 첫 번째는 모든 참가자와 각 단계별 순위이며, 두 번째 단계는 각 참가자별로 그룹화되고 전체 순위 (단계 순위 합)가 계산됩니다.mysql이 실제로 두 가지 복잡한 쿼리를 결합합니다.

점수와 각 단계에 대한 모든 참가자를 얻기 위해 먼저 쿼리 및

SELECT * FROM (
    SELECT alias, catabbr, sh_dq, raw, sdq, dnf, 
@rownum := IF(@stage != stage_name, 1, @rownum + 1) AS rowNum, 
@rank := IF(@prevVal != cTime, @rownum, @rank) AS rank, 
@stage := stage_name as stage_name, 
@prevVal := cTime AS cTime, 
id, zeroTime 
    FROM 
(SELECT @rownum:= 0) rn, 
(SELECT @rank:= 1) av, 
(SELECT @stage:= '') sv, 
(SELECT @prevVal:= 0) pv, 
(SELECT s.stage_name stage_name, sc.alias alias, sc.catAbbr catabbr, sc.sh_dq sh_dq, sc.time raw, sc.id id, sc.sdq sdq, sc.dnf dnf, 
    IF(sc.time = "0", 1, 0) AS zeroTime, 
    ((ROUND(sc.time, 2) + (sc.miss * 5)) + ((sc.proc * 10) + (sc.saf * 10) + (sc.sog * 30)) - (sc.bthPoints)) cTime 
    FROM matches m 
    LEFT JOIN stages s ON s.match_id = m.id 
    LEFT JOIN scores sc ON sc.stage_id = s.id 
    WHERE m.matchuuid = 'E13A4C61-A2B8-48E2-BE1B-1FFB77CC5849' 
    GROUP BY sc.alias, s.stage_name 
    ORDER BY s.stage_name, zeroTime, cTime 
) tv 
) t 
ORDER BY zeroTime, alias, stage_name; 

출력 위 : 이름으로

+-----------+---------+-------+-----------------+-----+-----+--------+------+-----------------------+-------+----------+ 
| alias  | catabbr | sh_dq | raw    | sdq | dnf | rowNum | rank | stage_name   | cTime | zeroTime | 
+-----------+---------+-------+-----------------+-----+-----+--------+------+-----------------------+-------+----------+ 
| Back Bob | S  | 0  | 52.9799995422 | 0 | 1 | 54  | 54 | Stage 1    | 92.98 | 0  | 
+-----------+---------+-------+-----------------+-----+-----+--------+------+-----------------------+-------+----------+ 
| Back Bob | S  | 0  | 43.9099998474 | 0 | 0 | 46  | 46 | Stage 2    | 48.91 | 0  | 
+-----------+---------+-------+-----------------+-----+-----+--------+------+-----------------------+-------+----------+ 
| Ben Scal | ES  | 0  | 26.9699993134 | 0 | 0 | 27  | 27 | Stage 1    | 31.97 | 0  | 
+-----------+---------+-------+-----------------+-----+-----+--------+------+-----------------------+-------+----------+ 
| Ben Scal | ES  | 0  | 32.8800010681 | 0 | 0 | 38  | 38 | Stage 2    | 42.88 | 0  | 
+-----------+---------+-------+-----------------+-----+-----+--------+------+-----------------------+-------+----------+ 

두 번째 쿼리 그룹 참가자 및 최종 순위

에 대한 자신의 계급을 요약
SELECT alias, catabbr, SUM(cTime) fTime, SUM(rank) fRank, zeroTime, rank 
FROM (
    SELECT alias, catabbr, sh_dq, raw, sdq, dnf, 
@rownum := IF(@stage != stage_name, 1, @rownum + 1) AS rowNum, 
@rank := IF(@prevVal != cTime, @rownum, @rank) AS rank, 
@stage := stage_name as stage_name, 
@prevVal := cTime AS cTime, 
id, zeroTime 
    FROM 
(SELECT @rownum:= 0) rn, 
(SELECT @rank:= 1) av, 
(SELECT @stage:= '') sv, 
(SELECT @prevVal:= 0) pv, 
(SELECT s.stage_name stage_name, sc.alias alias, sc.catAbbr catabbr, sc.sh_dq sh_dq, sc.time raw, sc.id id, sc.sdq sdq, sc.dnf dnf, 
    IF(sc.time = "0", 1, 0) AS zeroTime, 
    ((ROUND(sc.time, 2) + (sc.miss * 5)) + ((sc.proc * 10) + (sc.saf * 10) + (sc.sog * 30)) - (sc.bthPoints)) cTime 
    FROM matches m 
    LEFT JOIN stages s ON s.match_id = m.id 
    LEFT JOIN scores sc ON sc.stage_id = s.id 
    WHERE m.matchuuid = 'E13A4C61-A2B8-48E2-BE1B-1FFB77CC5849' 
    GROUP BY sc.alias, s.stage_name 
    ORDER BY s.stage_name, zeroTime, cTime 
) tv 
) t 
GROUP BY alias 
ORDER BY zeroTime, fRank, fTime; 

출력 :

+-----------+-----------+-----------+-------+-----------+ 
| alias  | catabbr | fTime  | fRank | zeroTime | 
+-----------+-----------+-----------+-------+-----------+ 
| Back Bob | S   | 141.89 | 100 | 0   | 
+-----------+-----------+-----------+-------+-----------+ 
| Ben Scal | ES  | 74.85  | 68 | 0   | 
+-----------+-----------+-----------+-------+-----------+ 

zeroTime 열을 사용하면 0보다 큰 시간으로 정렬하고 순위를 올바르게 계산할 수 있습니다.

나는 그들과 합류하려고 할 때 어떤 결과도 얻지 못합니다. 이 두 쿼리를 하나의 쿼리로 결합/결합하여 다음과 같은 결과를 출력 할 수 있습니까?

+-----------+-----------+-----------+-------+-----------+---------------+---------------+---------------+---------------+ 
| alias  | catabbr | fTime  | fRank | zeroTime | Stage 1 Time | Stage 1 Rank | Stage 2 Time | Stage 2 Rank | 
+-----------+-----------+-----------+-------+-----------+---------------+---------------+---------------+---------------+ 
| Ben Scal | ES  | 74.85  | 68 | 0   | 31.97   | 27   | 42.88   | 38   | 
+-----------+-----------+-----------+-------+-----------+---------------+---------------+---------------+---------------+ 
| Back Bob | S   | 141.89 | 100 | 0   | 92.98   | 54   | 48.91   | 46   | 
+-----------+-----------+-----------+-------+-----------+---------------+---------------+---------------+---------------+ 

는 PHP 페이지로 갈 것, 그래서 내가 필요로 당겨 루프를 통해 할 수있는, 내가 할 노력하고있어 중요한 것은이 두 쿼리를 조인.

내 구조와 데이터가 sqlfiddle에 비해 너무 큽니다. 다음 경기와 단계에 대한 구조와 삽입은 다음과 같습니다 http://pastebin.com/YvZevd5j 다음은 점수에 대한 구조와 삽입입니다 : 너무주의하는 것이 http://pastebin.com/jLBYxMvc

한 가지를, 게임이 1 단 이상 1 개 이상 particpants을 가질 수 있다는 것입니다.

답변

0

이 답변은 단계 수를 알아야 할 필요가 있기 때문에 확장이 잘되지 않을 수 있지만 응용 프로그램에서 루프 또는 무언가로 건물을 처리 할 수는 있습니다. 단순화 된 버전은 데이터로 작동하도록 수정할 수 있습니다.

SELECT 
    alias, 
    catAbbr, 
    sum(fTime) as fTime, 
    sum(fRank) as fRank, 
    sum(zeroTime) as zeroTime, 
    sum(Stage_1_Time) as stage_1_Time, 
    sum(Stage_1_Rank) as Stage_1_Rank, 
    sum(Stage_2_Time) as stage_2_Time, 
    sum(Stage_2_Rank) as Stage_2_Rank 
FROM (
    SELECT 
    alias, 
    catAbbr, 
    0 as fTime, 
    0 as fRank, 
    0 as zeroTime, 
    Stage_1_Time as stage_1_Time, 
    Stage_1_Rank as Stage_1_Rank, 
    0 as stage_2_Time, 
    0 as Stage_2_Rank 
    FROM (query that gets stage 1 info) 
    UNION 
    SELECT 
    alias, 
    catAbbr, 
    0 as fTime, 
    0 as fRank, 
    0 as zeroTime, 
    0 as stage_1_Time, 
    0 as Stage_1_Rank, 
    stage_2_Time as stage_2_Time, 
    Stage_2_Rank as Stage_2_Rank 
    FROM (query that gets stage 2 info) 
    UNION 
    SELECT 
    alias, 
    catAbbr, 
    fTime as fTime, 
    fRank as fRank, 
    zeroTime as zeroTime, 
    0 as stage_1_Time, 
    0 as Stage_1_Rank, 
    0 as stage_2_Time, 
    0 as Stage_2_Rank 
    FROM (query that gets averaged info) 
) temp 
GROUP BY alias, catAbbt 
+0

내가 손에 몇 개의 단계가 있는지는 알았지 만, 동적이지 않아야한다. 나는 앞서 가서 두 쿼리를 사용하고 PHP를 통해 데이터를 병합하는 방법을 발견했습니다. 생각해 줘서 고마워. – codivist

관련 문제