我进行了搜索,但似乎找不到合适的关键字来描述我要实现的目标,因此,如果这是一个已知问题,请宽容,只需将我指向正确的关键字即可。
我有以下表格/条目:
select * from personnes where id=66;
id | aclid | referendid | login | validated | passwd
66 | | | toto@tiiti.com | f | $2y$10$w3DRh/g2Tebu/mkMcQz32OUB.dDjFiBP99vWlMrrPWpR45JZDdw4W
和
select * from pattributs where (name='nom' OR name='prenom') AND persid=66;
id | name | value | persid
----+--------+-------+--------
90 | prenom | Jean | 66
91 | nom | Meyer | 66
现在,我使用该表格来使主表不混乱,因为根据情况,我是否记录名称。...
但是将视图作为已完成表格的表格会很好,所以我尝试:
select (personnes."id","login",
(select "value" from pattributs where "name"='nom' AND "persid"=66),
(select "value" from pattributs where "name"='prenom' AND "persid"=66)
) from personnes where personnes.id=66;
这似乎可以做到:
row
--------------------------------
(66,toto@tiiti.com,Meyer,Jean)
但是列标签消失了,能够从调用的php脚本中获取它们非常有用,但是当我添加时:
select (personnes."id","login",
(select "value" from pattributs where "name"='nom' AND "persid"=66),
(select "value" from pattributs where "name"='prenom' AND "persid"=66) as 'prenom')
from personnes where personnes.id=66;
我在as指令处收到语法错误...所以我可能不了解如何正确执行此操作,大括号表示这已不再以表格形式出现),那么如何获得以下结果:
id | login | nom | prenom
66 |toto@tiiti.com | Meyer | Jean
想法是为每个用例存储一个合适的视图,仅捆绑相关列。
预先感谢
答案 0 :(得分:1)
要回答您的问题:您正在丢失列名称,因为您正在创建一个简单的数据集(一行)。这是由您的牙套完成的。没有它们,您应该会得到预期的结果。
但是您的解决方案不是很好:您应该避免在每个子查询中计算单个列。只需一个SELECT
即可轻松完成:
select
pe.id,
pe.login,
MIN(pa.value) FILTER (WHERE pa.name = 'nom') as nom,
MIN(pa.value) FILTER (WHERE pa.name = 'prenom') as prenom
from
personnes pe
join pattributs pa ON pe.id = pa.persid AND pe.id = 66
where pa.name = 'nom' or pa.name = 'prenom'
group by pe.id, pe.login
首先,您需要一个JOIN
才能将两个表的正确数据集组合在一起。您应该加入id
。
然后您会遇到一个问题,即您的名称有两行(这似乎设计得不太好,为什么没有两列?)。这两个值可以按id
分组。现在您可以汇总它们。
我正在做的是“聚合”它们(我使用的函数无关紧要,因为它应该只是一个值)。 FILTER
子句过滤出正确的值。