的Postgres的sql不工作的PHP
问题描述:
9.3 string_agg功能我有这样的一组表:的Postgres的sql不工作的PHP
用户表:
id username
1 user
组表:
id name
1 g1
2 g2
users_groups表:
user_id group_id
1 1
1 2
我想获得这个r esult:
id username user_groups
1 user g1,g2
我发现,使用string_agg可以解决这个问题,而且它确实Postgres的控制台上,但是当我用PHP相同的查询,我得到这个消息
SQLSTATE[HY000]: General error: 1 no such function: string_agg
这里是我的查询:
select users.id, users.username, string_agg(groups.name, ', ')
from users
inner join users_groups on users.id = users_groups.user_id
inner join groups on groups.id = users_groups.group_id
group by users.id
由我使用的方式:
- 的PostgreSQL-9.3
- PHP 5.6.0
- 阿帕奇2
- Windows 7的
- laravel 5.0
答
从
users.username
失踪
GROUP BY
除了没有什么错的查询,所以这个问题可能在PHP方面。一个解决方案,可能的工作是把你的查询到一个视图,然后调用从PHP:
CREATE VIEW users_with_groups AS
SELECT users.id, users.username, string_agg(groups.name, ', ') AS groups
FROM users
JOIN users_groups ON users.id = users_groups.user_id
JOIN groups ON groups.id = users_groups.group_id
GROUP BY users.id, users.username;
你的PHP代码现在变成一个相当简单的DB::table('users_with_groups')->select
,而不是你现在有复杂的语句。 (请注意,在SQL中VIEW
就像一个“虚拟”的表,你可以将所有的操作就可以了,就像在常规表。)
这种方法一般一个好主意:PostgreSQL没有SELECT
更多的选择语句比PHP(或其他任何框架)实际可行的语句更多。而且你将所有复杂的查询集中到一个地方(数据库),使安全性分析和维护变得更加容易。
+0
是的,我认为这是在PHP方面,但仍不知道是什么问题,我会继续寻找。 一个视图是避免这个问题的一个好主意,它让我的思想滑落了,谢谢@Patrick – yazfield
首先,你应该'GROUP BY users.id,users.username'。什么是'groups.name'列的数据类型? – Patrick
你可以显示php代码吗? – Renzo
@Patrick我没有'group by users.username'没有任何变化,'groups.name'是varchar – yazfield