0

我有这组表:

用户表:

id    username
 1      user

组表:

id    name
 1     g1
 2     g2

用户组表:

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

顺便说一句,我正在使用:

  • postgresql-9.3
  • php 5.6.0
  • 阿帕奇 2
  • Windows 7的
  • 拉拉维尔 5.0
4

1 回答 1

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,而不是您现在拥有的复杂语句。(请注意,VIEWSQL 中的 a 就像一个“虚拟”表,您可以像在常规表上一样对其应用所有操作。)

这种方法通常是一个好主意:PostgreSQL 的SELECT语句选项比 PHP(或任何其他框架)实际上可能提供的选项多得多。您将把所有复杂的查询放在一个地方(数据库),使安全分析和维护变得更加容易。

于 2015-07-23T00:18:31.497 回答