2012-11-12 148 views
2

加入我有3个tabels以下定义Select查询语句中Postresql

people 
------ 
- wid 
- name 

types 
----- 
- guid 
- type 

mapping 
------- 
- guid 
- wid 

百姓餐桌拥有人

的类型表中的每个类型信息列表排在人桌上。如果一个人属于多个类型,那么类型表中会出现两行。

映射表提供了人员和类型表之间的映射。

现在要找出谁是“政客”类型的人,我可以使用以下查询。

select name from people inner join 
(mapping inner join types on mapping.guid = types.guid) 
on people.wpid = mapping.wpid where types.type = 'politician' 

但是现在我想知道政治家属于哪些类型。我知道我必须使用group byhaving条款。但我无法想出这个问题。如何编写这个查询?

回答

1

尝试过滤表:

select p.name, t2.type 
from types t1 
join mapping m1 on m1.guid = t1.guid 
join people p on p.wpid = m1.wpid 
join mapping m2 on p.wpid = m2.wpid 
join types t2 on m2.guid = t2.guid 
where t1.type = 'politician' 
order by 1, 2 

- 列出所有政治家和他们所属的所有类型。

或者,如果你只是想所有的政客的名单和不同类型的他们属于,请尝试:

select p.name, count(*) 
from mapping m1 
join people p on p.wpid = m1.wpid 
join mapping m2 on p.wpid = m2.wpid 
where m1.guid = 1 /* replace 1 with appropriate guid for politicians */ 
group by p.name 
order by 1 
1

必须使用group by来为一组值(例如接收不同类型的计数或值的总和)提供聚合函数的结果。如果您只需要获取某人属于哪组类型,则可以使用这样的单个查询。

select name, types 
from people inner join 
(mapping inner join types on mapping.guid = types.guid) 
on people.wpid = mapping.wpid 
where people.wpid in (select people.wpid from people inner join 
(mapping inner join types on mapping.guid = types.guid) 
on people.wpid = mapping.wpid where types.type = 'politician') 

由一组将是有益的知道政治家是多少组到

select name, count(types) 
from people inner join 
(mapping inner join types on mapping.guid = types.guid) 
on people.wpid = mapping.wpid 
where people.wpid in (select people.wpid from people inner join 
(mapping inner join types on mapping.guid = types.guid) 
on people.wpid = mapping.wpid where types.type = 'politician') 
group by name 

编辑:避免在子查询

如果你知道政治家的GUID小组,你可以做这样的事情。我没有测试查询,但这个想法是使用与映射表的连接与GUID等于政治家GUID

select p.name, count(t.types) 
from people p inner join mapping m1 
on p.wid = m1.wid and m1.guid = [politician guid] 
inner join mapping m2 
on p.wid = m2.wid 
inner join types t 
in m2.guid = t.guid 
+0

感谢。我想我和'group by'混淆了。顺便说一句,有可能避免'in'子查询?人tabel有大约200万行,这个查询可能太慢了:( – Sudar

+0

编辑为这个问题添加解决方案 –