加入三个表,以便放弃额外的匹配?

时间:2015-07-02 03:14:25

标签: mysql sql join

如何编写查询以提供三个表的结果,以便每个"行"只有一个结果?

表格是:

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

关系是: T1-T2 1:1T1-T3 1:M - T3中每个ID可以有多个地址行。

我想要的是所有上述字段的用户列表,但是 IF 他们有一个地址,我只想记录一个(如果它是最新的基于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

,我不断获得多个副本

3 个答案:

答案 0 :(得分:2)

此查询应该有效:

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行的集合。

答案 1 :(得分:1)

所以T2在这里实际上并不相关。您只需要一种从T1到T3加入的方式,每个T1行最多可以获得一个T3行。

这样做的一种方法是:

select 
  T1.*, 
  (select address from T3 where T3.ID=T1.ID order by date_modified desc limit 1)
from T1;

这可能非常有效,是一个相关的子查询,但您可能并不在意,具体取决于数据集的大小。

它也只适合从T3获得一列,所以如果你有地址,城市和州,你必须找出别的东西。

答案 2 :(得分:0)

您可以使用Top 1的子查询,这样您只能从T3获得一个结果

这是一个示例sql

select * into #T1 from(
select 1 ID
union select 2
union select 3) A

select * into #T2 from(
select 1 ID
union select 2
union select 3) A

select * into #T3 from(
select 1 ID, 'ABC' Address, getDate() dateModified
union select 1, 'DEF', getDate()
union select 3, 'GHI', getDate()) A

select *, (select top 1 Address from #T3 T3 where T3.ID= T1.ID order by datemodified desc) from #T1 T1
inner join #T2 T2 on T1.ID = T2.ID

奖励: - 您还可以通过dateModified desc添加订单以获取最新地址