2012-02-09 106 views
0

我有一些問題搞清楚什麼似乎很簡單,但它躲過了我。任何幫助深表感謝。計數查詢沒有正確分組

CREATE TABLE IF NOT EXISTS `match_history` (
    `id` int(11) NOT NULL auto_increment, 
    `match_id` int(11) NOT NULL, 
    `team_id` int(11) NOT NULL, 
    `player_id` int(11) NOT NULL, 
    `map` varchar(150) NOT NULL, 
    `score` int(11) NOT NULL, 
    `outcome` varchar(25) NOT NULL, 
    `notes` longtext NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=271 ; 

match_id links to matches.id 
team_id links to matchteams.id 
player_id links to persons.id 

我希望看到的是勝利和每隊的損失,但我有問題,因爲上面的match_history表將每場比賽,每個隊多行。

例如:

INSERT INTO `match_history` (`id`, `match_id`, `team_id`, `player_id`, `map`, `score`, `outcome`, `notes`) VALUES 
(221, 44, 2, 124, 'Village', 1570, 'Win', ''), 
(220, 44, 2, 115, 'Village', 1600, 'Win', ''), 
(219, 44, 2, 92, 'Village', 2740, 'Win', ''), 
(218, 44, 4, 105, 'Village',1000, 'Loss', ''), 
(217, 44, 4, 111, 'Village', 1220, 'Loss', ''), 
(216, 44, 4, 130, 'Village', 1440, 'Loss', ''), 
(215, 44, 4, 122, 'Village', 2160, 'Loss', ''), 
(214, 44, 4, 130, 'Seatown', 1410, 'Loss', ''), 
(213, 44, 4, 122, 'Seatown', 1600, 'Loss', ''), 
(212, 44, 4, 111, 'Seatown', 1790, 'Loss', ''), 
(211, 44, 4, 105, 'Seatown', 1790, 'Loss', ''), 
(210, 44, 2, 113, 'Seatown', 1020, 'Win', ''), 
(209, 44, 2, 124, 'Seatown', 1480, 'Win', ''), 
(207, 44, 2, 115, 'Seatown', 2850, 'Win', ''), 
(208, 44, 2, 92, 'Seatown', 2160, 'Win', ''), 
(222, 44, 2, 113, 'Village', 900, 'Win', ''), 
(223, 45, 1, 123, 'Hardhat', 2970, 'Win', ''), 
(224, 45, 1, 26, 'Hardhat', 2930, 'Win', ''), 
(225, 45, 1, 107, 'Hardhat', 1710, 'Win', ''), 
(226, 45, 3, 101, 'Hardhat', 1530, 'Loss', ''), 
(227, 45, 3, 100, 'Hardhat', 1420, 'Loss', ''), 
(228, 45, 3, 125, 'Hardhat', 1010, 'Loss', ''), 
(229, 45, 1, 107, 'Seatown', 2520, 'Win', ''), 
(230, 45, 1, 123, 'Seatown', 2260, 'Win', ''), 
(231, 45, 1, 26, 'Seatown', 1560, 'Win', ''), 
(232, 45, 3, 101, 'Seatown', 1510, 25, 3, 42, 0.6, 0, 0, 0, 'Loss', ''), 

這是我用的查詢,但它的計算每一行的1

select mh.team_id as team_id, COUNT(distinct(mh.match_id)) as matches, 
    count(mh.map) as maps, mh.outcome, SUM(IF(mh.outcome='Win',1,0)) as wins, 
    SUM(IF(mh.outcome='Loss',1,0)) as losses, m.id, mt.name as teamname 
FROM match_history mh, matches m, ladders l, match_teams mt 
WHERE mh.team_id = mt.id and mh.match_id = m.id and 
    m.ladder_id = l.id and l.type = 'internal' 
GROUP by mh.team_id 
ORDER by wins desc 
+0

最近一次插入是怎麼回事? – 2012-02-09 15:11:04

回答

0

我不知道,因爲還沒有在一段時間嘗試SQL,但嘗試這個.. 讓我知道如果它使任何錯誤

select team_id, count(*) from match_history 
where outcome = 'Win' 
group by team_id 

,如果它工作,然後我們就可以癒合它與L-奧賽斯

編輯: 這種麻煩的事情...... 你最好別用好這個..我已經花了幾天時間(當然,至少分鐘:P)得到這個 我已經在SQL Server測試它如果需要的話,將它定製爲mysql。 祝你好運! :d

select aa.tid, aa.win, COALESCE(c.loss, 0) from 
(SELECT distinct a.team_id tid, COALESCE(b.win, 0) win 
    FROM [match_history] a 
    left join 
    (select team_id, count(*) win 
    from [match_history] 
    where outcome = 'Win' 
    group by team_id) b 
    on a.team_id = b.team_id)aa 

    left join 
    (select team_id, count(*) loss 
    from [match_history] 
    where outcome = 'Loss' 
    group by team_id) c 
    on aa.tid = c.team_id 

結果:

tid win Loss 
1 6 0 
2 7 0 
3 0 3 
4 0 8 
+0

Bhrugesh,感謝它仍然顯示太多。 ruakh,你有什麼建議來規範化這些數據? – 2012-02-09 19:26:33

+0

@PaulIlle我希望這個新的查詢適合你..祝你好運! :D – 2012-02-09 22:25:35

1

MySQL的,不像標準的SQL,允許包括(在SELECT條款)是不是在GROUP BY和不在現場列表列彙總列—請參閱http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html —但您必須小心,否則您可能會得到不可預知的結果。在你的情況,你GROUP荷蘭國際集團BYmh.team_id,所以你可以放心地包括依賴於團隊-ID(例如,mt.name應該是安全的)列,但你不能選擇mh.outcomem.id,因爲這取決於具體比賽。所以,我會刪除這些列。

然後,我們需要改變SUM(1-or-0)COUNT(DISTINCT match-ID-or-NULL)讓我們只算不同的比賽編號:

select mh.team_id as team_id, 
     COUNT(distinct(mh.match_id)) as matches, 
     count(mh.map) as maps, 
     COUNT(DISTINCT IF(mh.outcome='Win',m.id,NULL)) as wins, 
     COUNT(DISTINCT IF(mh.outcome='Loss',m.id,NULL)) as losses, 
     mt.name as teamname 
    FROM match_history mh, 
     matches m, 
     ladders l, 
     match_teams mt 
WHERE mh.team_id = mt.id 
    and mh.match_id = m.id 
    and m.ladder_id = l.id 
    and l.type = 'internal' 
GROUP by mh.team_id 
ORDER by wins desc 

應該做你想要什麼。

+0

好的答案,儘管我認爲即使選擇依賴於組的列也應該避免。 – 2012-02-09 15:18:22

+0

感謝您的快速響應,但看起來我還沒有收到我期望的數據。 – 2012-02-09 16:36:53

+0

哎呦。我打進了......我得到了每個人的入場費。例如,如果一個團隊中有4個人,那麼我將返回4而不是1,因爲它似乎對每個輸入的行進行計數,而不是match_id和team_id的唯一組合。 – 2012-02-09 16:38:09