Postgres:在桌子上加入两次

时间:2014-08-13 15:53:45

标签: sql postgresql

我(承认SQL noob)在Postgresql中有三个表,如下所示:

id |  name  | cat_id 
----+--------+--------
  1 | group1 |      1
  3 | group3 |      1
  2 | group2 |      2
  4 | group4 |      2

类别

id | name 
----+------
  1 | cat1
  2 | cat2

翻译

 id | source |  value  |   type   | res_id 
----+--------+---------+----------+--------
  1 | group1 | Gruppe1 | groups   |      1
  2 | group2 | Gruppe2 | groups   |      2
  3 | group3 | Gruppe3 | groups   |      3
  4 | group4 | Gruppe4 | groups   |      4
  5 | cat1   | Kat1    | category |      1
  6 | cat2   | Kat2    | category |      2

转换表对应用程序是全局的,并使用" res_id"引用其他表。和"键入"领域。所以要获得" group1"的翻译我需要使用"其中res_id = 1并输入=' groups'。

我需要按以下格式列出组:

类别|小组|翻译类别|翻译小组

这个查询几乎让我:

select category.name, groups.name, translation.value from groups                                                                                                              
join category on groups.cat_id = category.id
join translation on groups.id = translation.res_id
where type = 'groups';

但当然我错过了翻译的类别,并且不知道如何获得它。

1 个答案:

答案 0 :(得分:3)

我想你想要这样的东西:

select
  category.name, 
  groups.name, 
  tg.value AS translated_group,
  tc.value AS translated_category
from groups                           
inner join translation tg on (groups.id = tg.res_id AND tg.type = "groups")
inner join category on groups.cat_id = category.id
inner join translation tc on (category.id = tc.res_id AND tc.type = "category");

即。加入translation两次,为每个副本设置别名,并使用也会过滤type字段的连接条件。

未经测试,因为没有CREATE TABLEINSERT - 在问题中形成示例数据。

这些都不是PostgreSQL特有的,它只是标准的SQL。

顺便说一句,如果你不为表名混合复数和单数形式,那就更好了。