如何编写查询以给出三个表的结果,以便每个“行”只有一个结果?

这些表是:

T1 (ID, name, IP)
T2 (ID, date_joined)
T3 (ID, address, date_modified)


关系是:
T1-T2 1:1T1-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行的集合。

10-07 13:27
查看更多