2014-05-15 56 views
0

我莫名其妙地停留在一个非常简单的任务编组行..和两个不同的表

我有两个表:

TABLE A: 
name time 
name1 100 
name2 50 
name1 200 
name3 100 
name2 50 

TABLE B: 
name time 
name3 100 
name1 50 
name3 200 
name2 100 
name1 50 

所有我想要的是第一个列表共有2个最高时间的名字!

像这样的东西(但dowsn't工作OFC)

SELECT a.name 
     , SUM(a.time) as time1 
     , (SELECT SUM(time) FROM table2 b WHERE b.name = a.name GROUP BY a.name) as time2 
     , time1 + time2 as total 
FROM table1 a 
GROUP BY a.name 
ORDER BY total DESC 
LIMIT 2 

提前感谢!

+0

什么会期望的结果集是什么样子?为什么你有两张桌子? – Strawberry

+1

是相关的两个表,所以你可以'加入'他们?如果不是,那么你需要一个'union'查询来从两者中进行选择,然后用一个容器查询来完成你的'前2名'。 –

+0

@Strawberry:期望的结果应该是这样的:1. name3 600 2. name1 400 – knzo

回答

1

我喜欢的东西去:

SELECT 
    name, 
    SUM(time) AS total_time 
    FROM (
    SELECT name, time FROM table_a 
    UNION ALL 
    SELECT name, time FROM table_b 
) AS u 
    GROUP BY name 
    ORDER BY total_time DESC 
    LIMIT 2 
; 

这里是你的数据working sqlfiddle

+0

谢谢,但这并不正确。总和是不正确的。名字1应该有400,而不是800例如 – knzo

+0

哇,我怎么错过了?我纠正了我的答案,'UNION ALL'是要走的路。该方法类似于@罗布的,即使我认为我的是一个更清洁;-) – svvac

+0

是的,谢谢。这是一个更清洁,你是对的。无论如何感谢罗布, – knzo

0

试试这个...

SELECT name, SUM(timeA + timeB) AS total 
FROM (
    SELECT name, time as timeA, 0 as timeB 
    FROM a 
    UNION ALL 
    SELECT name, 0 as timeA, time as timeB 
    FROM b 
) AS times 
GROUP BY name 
ORDER BY total DESC 
+0

非常感谢。这样可行! – knzo