子查询或加入MySQL?

时间:2013-05-01 01:39:35

标签: mysql compare rows

表联盟

team_id name        wins    losses  played  recorded    created
1       dodgers     10      4       14      1364790000  1353215830
2       angels      9       6       15      1364790000  1353661376
3       pirates     12      3       15      1364790000  1353543466

team_id name        wins    losses  played  recorded    created
1       dodgers     22      9       31      1367274480  1353215830
2       angels      14      17      31      1367274480  1353661376
3       pirates     19      13      32      1367274480  1353543466
4       yankees     10      9       19      1367274480  1365577298
5       brewers     7       11      18      1367274480  1365394448

将结果视为:

team_id name        wins    losses  played
1       dodgers     12      5       17      
2       angels      5       11      16
3       pirates     7       10      17
4       yankees     10      9       19
5       brewers     7       11      18

我已尝试使用连接进行多次查询,但没有成功。每天,队伍,胜利,失败和比赛被捕获并在记录栏上加盖时间戳。该团队是在创建的列上创建的。 (所有unix时间戳)我正在尝试的两个日期之间有几行,但我不需要它们用于此查询。

我想做的是为现有和新的团队获得四月的赢/输/玩,我尝试了几个问题,这里有几个没有给我预期结果:

SELECT a.name as name, a.wins-b.wins as wins, a.losses-b.losses as losses, a.played-b.played as played from league a join league b on a.id=b.id where a.recorded= 1367274480 and b.recorded= 1364790000

SELECT new.*, new.wins-old.wins as newwins, new.losses-old.losses as newlosses FROM league new LEFT JOIN league old ON new.id=old.id WHERE (new.recorded=1367274480 and old.recorded=1364790000) or (new.created > 1364790000 and new.recorded=1367274480) GROUP BY new.id

2 个答案:

答案 0 :(得分:0)

数据的设置方式,似乎您每天都没有记录值。但是,每列都会增加,因此您可以获取当月的最大值和最小值之间的差异。

试试这个:

SELECT l.name as name,
       max(l.wins)-min(l.wins) as wins,
       max(l.losses)-min(l.losses) as losses,
       max(l.played)-min(l.played) as played
from league l
where l.recorded <= 1367274480 and l.recorded >= 1364790000
group by l.name

答案 1 :(得分:0)

您希望后面的记录的每一行和前面的行数相同,因此您需要使用LEFT JOIN为两个日期之间创建的团队获取NULL,但是较小的表的WHERE recorded条件应该被移动为ON条件以进行连接。

还要记住2-NULL = NULL,因此您需要使用coalesce()将NULL更改为0。

SELECT a.name AS name, 
       a.wins - COALESCE( b.wins, 0 ) AS wins, 
       a.losses - COALESCE( b.losses, 0 ) AS losses, 
       a.played - COALESCE( b.played, 0 ) AS played
FROM league a LEFT JOIN league b 
ON a.team_id = b.team_id AND b.recorded =1364790000
WHERE a.recorded =1367274480