【问题标题】:postgres sql 9.3 string_agg function not working on PHPpostgresql 9.3 string_agg 函数不适用于 PHP
【发布时间】:2015-07-22 00:46:35
【问题描述】:

我有这组表格:

用户表:

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

顺便说一句:

  • postgresql-9.3
  • php 5.6.0
  • 阿帕奇 2
  • Windows 7
  • laravel 5.0

【问题讨论】:

  • 首先,你应该GROUP BY users.id, users.usernamegroups.name 列的数据类型是什么?
  • 你能显示php代码吗?
  • @Patrick 我做了group by users.username 没有改变,groups.name 是 varchar
  • @Renzo php 代码没有什么特别之处,它只是使用 laravel 进行的测试,但这里是:dd(DB::table('users')->select(DB::raw("users.id, users.username, string_agg(groups.name, ', ')"))->join('users_groups', 'users.id', '=', 'users_groups.user_id')->join('users_groups', 'groups.id', '=', 'users_groups.group_id')->groupBy('users.id', 'users.username')->get());

标签: php postgresql laravel string-aggregation


【解决方案1】:

除了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(或任何其他框架)实际可行的选项更多的选项。您可以将所有复杂的查询集中在一个地方(数据库),从而使安全分析和维护变得更加容易。

【讨论】:

  • 是的,我认为它是在 PHP 方面,但仍然不知道是什么问题,我会继续寻找。视图是避免这个问题的好主意,它让我忘记了,谢谢@Patrick
猜你喜欢
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 2011-07-20
  • 2011-09-22
相关资源
最近更新 更多