2014-11-22 79 views
2

問:如何使sql查詢只返回1行?或者如何合併或2分的結果合併爲1

  • 如何使合併或者2隊成績合併爲1?或
  • 如何使它只返回1行?

表名:series_type

id| type| description 
1 | 0| No series (Any team win 1 will be the winner) 
2 | 1| Best of 3 (Any team wins 2 will be the winner else draw) 
3 | 2| Best of 5 (Any team wins 3 will be the winner else draw) 

表名:

 ID| name 
    1848158| LV 
     15| LGD 

表名:匹配

ID| series_id | series_type | league_id | start_time |radiant_name | dire_name | radiant_win 
1 |  8313 |   2 |  2096 | xxxxxxx1 |   LV |  LGD | true 
2 |  8313 |   2 |  2096 | xxxxxxx2 |   LGD |  LV | false 
3 |  8313 |   2 |  2096 | xxxxxxx3 |   LV |  LGD | false 
4 |  8313 |   2 |  2096 | xxxxxxx4 |   LV |  LGD | false 
5 |  8313 |   2 |  2096 | xxxxxxx5 |   LGD |  LV | false 

查詢:

SELECT series_id, team, SUM(Win) As Won, SUM(Loss) as Lost 
FROM 
(SELECT *,radiant_name as team, 
    CASE WHEN radiant_win = 1 THEN 1 ELSE 0 END as Win, 
    CASE WHEN radiant_win = 1 THEN 0 ELSE 1 END as Loss 
    FROM matches 
    UNION ALL 
    SELECT *,dire_name as team, 
    CASE WHEN radiant_win = 0 THEN 1 ELSE 0 END as Win, 
    CASE WHEN radiant_win = 0 THEN 0 ELSE 1 END as Loss 
    FROM matches 
) as temp 
WHERE series_id = 8313 
GROUP By team 
ORDER By Won, Lost DESC 

結果:當由series_id組

series_id| team| Won| Lost| 
    8313| LV| 5| 5| 

結果:當由茶組米

series_id| team| Won| Lost| 
    8313| LGD| 2| 3| 
    8313| LV| 3| 2| 

預期結果:我需要它按series_id

series_id| teamA| teamB| teamAWon| teamBWon| teamALost| teamBLost| 
    8313| LV| LGD|  3|  2|   2|   3| 
+0

我回答,但你可以請把你的表結構,你想要的結果的一個明確的說法?另外,系列賽中還有兩支以上的球隊嗎?或者是兩支球隊在同一場比賽中進行比賽的每一場比賽? – jscott 2014-11-22 03:45:53

+0

爲什麼要包含原始表格和結構? – Edrich 2014-11-22 03:51:16

+0

請再次審查。謝謝 – ronscript 2014-11-22 04:01:47

回答

1

主要複雜因素是,每一個隊名可以在radiant_name或dire_name 0次或多次出現。因此,將團隊轉換爲每個團隊名稱中的一個列有點複雜。如果比賽有一個恆定的teamA和teamB列,然後是一列表明哪支球隊是光芒四射的,而另一列表明哪支球隊獲勝,那將更容易。

這是幾乎可以肯定不是最佳的,但它似乎工作:

-- create a two-column temp table with series ID and team name, insert rows from matches 
-- we'll wind up with one row per distinct radiant_name and distinct dire_name, 
-- so up to 4 rows for a series 
CREATE TEMPORARY TABLE IF NOT EXISTS tempteama AS 
select distinct series_id, radiant_name AS team 
from matches 
union 
select distinct series_id, dire_name AS team 
from matches; 

-- do this again in a second temp table, so we can join the two later 
-- (MySQL doesn't like to join temp tables against themselves) 
CREATE TEMPORARY TABLE IF NOT EXISTS tempteamb AS 
select distinct series_id, radiant_name AS team 
from matches 
union 
select distinct series_id, dire_name AS team 
from matches; 

-- join matches against the temp table to get final results 
select matches.series_id, 
teamA, 
teamB, 
sum(case when (radiant_name = teamA AND radiant_win=1) OR (dire_name=teamA AND radiant_win=0) then 1 else 0 end) AS teamA_win, 
sum(case when (radiant_name = teamB AND radiant_win=1) OR (dire_name=teamB AND radiant_win=0) then 1 else 0 end) AS teamB_win 
from matches 
join (
-- select just one row from the temp table. That gives us the combination of teams for the series. 
select tempteama.series_id, tempteama.team AS teamA, tempteamb.team AS teamB 
from tempteama 
join tempteamb on tempteama.series_id = tempteamb.series_id and tempteama.team != tempteamb.team 
limit 1 
) AS teamnames on teamnames.series_id = matches.series_id 
group by matches.series_id, teamA, teamB; 

你很可能做臨時表查詢作爲子查詢,在一些可讀性爲代價的。

+0

嘿,你可以看看這個。這是主要的。 http://stackoverflow.com/questions/27054402/how-to-query-counting-specific-wins-of-team-and-find-the-winner-of-the-series – ronscript 2014-11-22 03:51:11

+1

確定...對於特定系列,一個給定的團隊會成爲輻射團隊還是可怕團隊至少一次?或者是否有可能同一支球隊成爲該系列賽全場比賽的光芒四射的球隊? – jscott 2014-11-22 04:06:30

+0

這場比賽將給予每個球隊隨機位置如輻射或可怕。所以不僅有1個隊伍可怕,1個隊員對於輻射。 – ronscript 2014-11-22 04:10:44

0

我有兩個結果爲這個問題之一是用於爲Oracle SQL任何SQL和其它(如我用在它預言功能)

一個可以運行在任何SQL此解決方案: -

SELECT AB.SERIES_ID,TEAMA,TEAMB ,TEAMAWON,COUNT(STC.SERIES_ID)-TEAMAWON TEAMBWON, 
COUNT(STC.SERIES_ID)-TEAMAWON TEAMALOST, 
COUNT(STC.SERIES_ID)-(COUNT(STC.SERIES_ID)-TEAMAWON) TEAMBLOST FROM 
(
    SELECT MA.SERIES_ID,MA.RADIANT_NAME TEAMA,MA.DIRE_NAME TEAMB , 
    COUNT(RADIANT_WIN) TEAMAWON FROM MATCHES MA,SERIES_TYPE ST 
    WHERE MA.SERIES_TYPE=ST.TYPE 
    GROUP BY MA.SERIES_ID,MA.RADIANT_NAME,DIRE_NAME 
) AB, MATCHES STC 
WHERE (AB.SERIES_ID,AB.TEAMAWON) IN 
    (
    SELECT SERIES_ID,MAX(RADIANT_WIN) RAD 
    FROM 
    (
     SELECT MA.SERIES_ID,MA.RADIANT_NAME ,COUNT(RADIANT_WIN) RADIANT_WIN 
     FROM MATCHES MA,SERIES_TYPE ST 
     WHERE MA.SERIES_TYPE=ST.TYPE 
     GROUP BY MA.SERIES_ID,MA.RADIANT_NAME,DIRE_NAME 
    ) 
    GROUP BY SERIES_ID 
) AND STC.SERIES_ID=AB.SERIES_ID AND TEAMA IN (RADIANT_NAME,DIRE_NAME) 
GROUP BY AB.SERIES_ID,TEAMA,TEAMB ,TEAMAWON; 

現在我寫的解決方案誰正在尋求使用Oracle同樣的結果神諭人: -

SELECT SERIES_ID,GREATEST(RADIANT_NAME,DIRE_NAME) TEAMA, 
LEAST(RADIANT_NAME,DIRE_NAME) TEAMB ,max(RADIANT_WIN) TEAMAWON, 
SUM(RADIANT_WIN)-max(RADIANT_WIN) TEAMBWON, 
SUM(RADIANT_WIN)-max(RADIANT_WIN) TEAMALOST, 
SUM(RADIANT_WIN)-(SUM(RADIANT_WIN)-Max(RADIANT_WIN)) TEAMBLOST 
FROM 
(
    SELECT MA.SERIES_ID,MA.RADIANT_NAME,DIRE_NAME , 
    COUNT(RADIANT_WIN) RADIANT_WIN FROM MATCHES MA,SERIES_TYPE ST 
    WHERE MA.SERIES_TYPE=ST.TYPE 
    GROUP BY MA.SERIES_ID,MA.RADIANT_NAME,DIRE_NAME 
) GROUP BY SERIES_ID, 
    greatest(RADIANT_NAME,DIRE_NAME) ,least(RADIANT_NAME,DIRE_NAME); 
+0

錯誤太多。你可以使用phpmyadmin製作mysql版本。謝謝 – ronscript 2014-11-22 08:48:20

+0

ookk所以你在mysql環境下運行它..可能它可能不起作用,因爲我在oracle和sql dbms上做了它。我試圖找到任何在線的phpmyadmin環境來工作,並且很快會回來查詢這個dbms – 2014-11-22 08:55:09

+0

非常感謝時間。希望你做到。因爲我真的很需要它也變得優化。 – ronscript 2014-11-22 08:56:19