我(承认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';
但当然我错过了翻译的类别,并且不知道如何获得它。
答案 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 TABLE
和INSERT
- 在问题中形成示例数据。
这些都不是PostgreSQL特有的,它只是标准的SQL。
顺便说一句,如果你不为表名混合复数和单数形式,那就更好了。