2013-11-01 44 views
1

我有一場辯論比賽,我想知道哪支球隊獲勝並失去了最多的辯論。我遇到的問題是兩隊在辯論中競爭的身份是兩個不同的列(hostid,visitid)。統計列中數據包含在多列中的總和

我到目前爲止這給了我想要什麼,但它只顯示visitid數據。

CREATE TABLE teams (
     id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
     name VARCHAR(255) 
    ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB; 

    CREATE TABLE debates (
     debateid INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
     debatedate DATE NOT NULL, 
     hostid INT, 
     visitid INT, 
     winnerid INT 
    ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB; 

    INSERT INTO teams (id, name) VALUES 
    (1,'team one'), 
    (2,'team two'), 
    (3,'team three'), 
    (4,'team four'), 
    (5,'team five'), 
    (6,'team six'); 

    INSERT INTO debates (debateid, debatedate,hostid, visitid, winnerid) VALUES 
    (1,'2012-01-11', 1,2,1), 
    (2,'2012-01-11', 3,4,4), 
    (3,'2012-02-11', 5,6,5), 
    (4,'2012-02-11', 1,4,1), 
    (5,'2012-02-11', 2,5,5), 
    (6,'2012-02-11', 3,6,3), 
    (7,'2012-03-11', 6,1,1), 
    (8,'2012-03-11', 5,2,5), 
    (9,'2012-03-11', 3,4,4); 

SELECT 
    visitid AS id, 
    t.name AS name, 
    sum(visitid= deb.winnerid) as w, 
    sum(visitid != deb.winnerid) as l 
FROM debates AS deb 
JOIN teams t ON t.id = deb.visitid 
WHERE visitid != -1 
AND debatedate < CURDATE() 
GROUP BY id 
ORDER BY w DESC 

結果

----------------------------------------- 
    | ID | NAME  | W | L | 
    | 4 | team four | 2 | 1 | 
    | 5 | team five | 1 | 0 | 
    | 1 | team one | 1 | 0 | 
    | 6 | team six | 0 | 2 | 
    | 2 | team two | 0 | 2 | 
    ----------------------------------------- 

我如何結合這兩個列,我知道工會的,但我不能想辦法在這種情況下實施這一或者是什麼方法,我應該使用?

如果我有它想要的結果的工作將是下面例如當主機標識或visitid = winnerid

----------------------------------------- 
    | ID | NAME  | W | L | 
    | 1 | team one | 3 | 0 | 
    | 5 | team five | 3 | 0 |  
    | 4 | team four | 2 | 1 | 
    | 3 | team three | 1 | 2 | 
    | 2 | team two | 0 | 3 | 
    | 6 | team six | 0 | 3 | 
    ----------------------------------------- 

See fiidle for example

回答

1
SELECT t.id, 
     t.name, 
     SUM(t.id = d.winnerid) AS w, 
     SUM(t.id != d.winnerid) AS l 
FROM  debates AS d 
    JOIN teams AS t ON t.id IN (d.hostid, d.visitid) 
WHERE d.visitid != -1 -- not sure what purpose this serves 
    AND d.debatedate < CURDATE() 
GROUP BY t.id 
ORDER BY w DESC 

看到它的sqlfiddle

+0

謝謝,我之前沒有見過IN。很有用。 – ak85