如何编写查询以给出三个表的结果,以便每个“行”只有一个结果?
这些表是:
T1 (ID, name, IP)
T2 (ID, date_joined)
T3 (ID, address, date_modified)
关系是:
T1-T2 1:1
,T1-T3 1:M
-T3中每个ID可以有很多地址行。我想要的是上面所有字段的所有用户的列表,但是如果他们有地址,我只想记录一个(奖励是基于T3.date_modified的最新用户)。
因此,我应该以T1中的确切记录数结束(在这种情况下,该数目等于T2),然后不再增加。
我试过了:
select t.ID, t.name, t.IP, tt.ID, tt.date_joined, ttt.ID, ttt.address
from T1 t JOIN T2 tt ON (t.ID = tt.ID) JOIN T3 ttt ON (t.ID = ttt.ID)
我想到的是LEFT,RIGHT,INNER等的所有明智组合!由于T3,我不断获得重复
最佳答案
此查询应该工作:
select
t1.ID, t1.name, t1.IP, t2.date_joined, t3x.address
from t1
join t2 on t1.ID = t2.id
left join (
select t3.*
from t3
join (
select id, max(date_modified) max_date
from t3
group by id
) max_t3 on t3.id = max_t3.id and t3.date_modified = max_t3.max_date
) t3x on t1.ID = t3x.id
首先,在t1和t2之间进行普通联接,然后使用派生表(t3x)离开联接,该表是具有最新日期的t3行的集合。