我有这组表:
用户表:
id username
1 user
分组表:
id name
1 g1
2 g2
users_groups表:
user_id group_id
1 1
1 2
我希望得到这个结果:
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
就像我正在使用的方式:
答案 0 :(得分:1)
除了GROUP BY
上缺少users.username
之外,查询没有任何问题,因此问题可能出在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(或任何其他框架)实际可能的选项。并且您可以将所有复杂查询集中在一个位置(数据库),从而使安全性分析和维护变得更加容易。