2013-11-01 45 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