2011-03-18 67 views
1

我有三个现有的SQL表,我们称之为“团队”,“里程”和“骑手”。离开了绒毛,它们的结构是这样的:复杂3路SQL连接(其中表3必须在连接表1之前连接表2)

Table: teams 
------------+-------------+---------+ 
| team_name | captains_id | team_id | 
------------+-------------+---------+ 
| superbads | 11   | 1  | 
| superflys | 12   | 2  | 
------------+-------------+---------+ 

Table: riders 
--------------+-----------+----------+ 
| rider_name | team_id | rider_id | 
--------------+-----------+----------+ 
| donatello | 1   | 10  | 
| leonardo | 1   | 11  | 
| michelangelo| 2   | 12  | 
| raphael  | 2   | 13  | 
--------------+-----------+----------+ 

Table: miles 
--------------+-----------+----------+ 
| rider_id | miles  | id  | 
--------------+-----------+----------+ 
| 10   | 100  | 1  | 
| 10   | 62  | 2  | 
| 11   | 110  | 3  | 
| 11   | 100  | 4  | 
| 12   | 8   | 5  | 
| 12   | 22  | 6  | 
| 13   | 29  | 7  | 
| 13   | 2   | 8  | 
--------------+-----------+----------+ 

我需要返回与该团队产生的总里程队的名单(我还需要返回球队队长的名字,但是这是一个更容易一些) 。 难度在于我需要在骑手中加入里程,将“英里数”字段加起来,然后以某种方式加入队伍。

更改表结构几乎没有,因为这是一个现有的应用程序。这是一个LAMP环境,因此如果需要,在查询之后操作PHP数组是一个选项。

回答

3

这应做到:

select t.team_id, t.team_name, t.captains_id, sum(m.miles) as total_miles 
from teams t 
inner join riders r on r.team_id = t.team_id 
inner join miles m on m.rider_id = r.rider_id 
group by t.team_id, t.team_name, t.captains_id 
+0

我假设TEAM_ID是独一无二的;按此分组应该足够了。 – 2011-03-18 18:48:10

+0

令人惊讶的是,如果这些列没有出现在分组依据列表中,那么大多数数据库都不会让您在选择列表中包含非聚合列。 – 2011-03-18 18:50:31

+0

每当有人问我使用MS Access为他们写一个查询时,就会使我疯狂... – 2011-03-18 20:50:04