仅当第二条记录存在时才加入同一表

时间:2014-03-05 02:18:06

标签: mysql

我正在尝试构建一个连接到同一个表的select查询,如果连接表中有两个不同的记录,如果没有,则返回null。它是这样的:

SELECT t1.title, t3a.name, t3b.name
from t1
join t2a on t1.id = t2a.id
join t2b on t1.id = t2b.id
join t3a on t2a.xid = t3a.xid
join t3b on t2b.xid = t3b.xid

我将省略所有连接类型的排列以及我尝试过的语句限定符(没有一个有效),但要点是:

t1在t2-> t3中始终具有至少一个对应的记录关系,有时两个。我希望我的结果是:

Title | Related Record 1 | Related Record 2 (if exists)

我得到的是有时候我想要的东西,但更多的是

Title | Related Record 1 | Related Record 1

无论t2 / t3中是否存在两个不同的相关记录集,都会发生这种情况。但是在同一个查询中,有时会返回不同的记录,有时第一个结果会重复两次。

这有意义吗?我为我的问题的基本性质道歉: - )

1 个答案:

答案 0 :(得分:1)

如果我正确理解了问题和评论,那么查询确实是:

select t1.title, t3a.name, t3b.name
from t1 join
     t2 t2a
     on t1.id = t2a.id join
     t2 t2b
     on t1.id = t2b.id join
     t3 t3a
     on t2a.xid = t3a.xid join
     t3 t3b
     on t2b.xid = t3b.xid;

我认为使用相同的join条件两次加入相同的表没有任何价值,因此我怀疑您使用以下方法得到相同的结果(可能是重复次数较少):

select t1.title, t3.name
from t1 join
     t2 t2
     on t1.id = t2.id join
     t3 t3
     on t2.xid = t3.xid;

如果有多个匹配项,则这些匹配项将显示在不同的行上。要将它们放在一行,您可以使用聚合:

select t1.title, min(t3.name) as name1,
       (case when min(t3.name) <> max(t3.name) then max(t3.name) end) as name2
from t1 join
     t2 t2
     on t1.id = t2.id join
     t3 t3
     on t2.xid = t3.xid
group by t1.title

如果只有一个名称,则条件只会生成第三列NULL