左边连接3个表不能像我期望的那样工作

时间:2017-07-24 17:26:22

标签: mysql left-join

我有这3张桌子: - 角色表 - 语言表 - 角色翻译表

enter image description here

enter image description here

enter image description here

我想用翻译请求所有角色,如果没有翻译,则显示'翻译'。

我尝试了这个没有成功:

select 
r.id_role, 
t.id_langue, 
case when t.id_langue is null then 'to translate' else t.libelle end
from role r 
left join trad_role t on r.id_role = t.id_role
left join langue l on t.id_langue = l.id_langue 
order by t.id_role;

在此示例中,ADMIN角色未翻译为英语。所以我希望能够翻译出来。对于英语。我没有。

结果是:

enter image description here

我希望也有这条线: ADMIN / en /翻译

我的要求有什么问题?谢谢你的帮助。

的Dom

编辑:我也尝试过这样做,没有成功:

select * from
(select t.id_role, t.id_langue, t.libelle
from role r
join trad_role t on r.id_role = t.id_role) T1
left join langue l on l.id_langue = T1.id_langue;

2 个答案:

答案 0 :(得分:1)

尝试:

select  
  r.id_role, 
  l.id_langue, 
  case when t.id_langue is null then 'to translate' else t.libelle_langue end
from role r
cross join langue l
left join trad_role t on r.id_role = t.id_role and t.id_langue = l.id_langue
;

演示:http://sqlfiddle.com/#!9/30e71d/14

| id_role | id_langue | case when t.else               |
|---------|-----------|--------------------------------|
|   ADMIN |        fr |                 Administrateur |
|   ADMIN |        it |                  Administatore |
|   ADMIN |        en |                   to translate |

答案 1 :(得分:0)

你可以尝试一下:

select 
    r.id_role, 
    t.id_langue, 
    IF(l.id_langue is null,'to translate',t.libelle) as 'status'
from role r 
left join trad_role t 
    on r.id_role = t.id_role
left join langue l 
    on t.id_langue = l.id_langue 
order by t.id_role;

基本上,我没有测试未连接的表中的列(因此不会为null),而是测试左连接表中的列。