Php 多个列的字符串\u agg

Php 多个列的字符串\u agg,php,sql,postgresql,Php,Sql,Postgresql,我有以下选择 $repairs = DB::select(DB::raw(' select r.id repair_id, w.name, w.surname from repairs r join repair_worker rw on r.id = rw.repair_id join workers w on w.id = rw.worker_id

我有以下选择

$repairs = DB::select(DB::raw('
            select r.id repair_id, w.name, w.surname
                from repairs r
                    join repair_worker rw on r.id = rw.repair_id
                    join workers w on w.id = rw.worker_id
                where r.vehicle_id = ?
                group by w.name, w.surname, r.id
           '),[$vehicle->id]);
我试着把
w.name
w.lasname
放在一个字段中,例如用逗号分隔。有一个函数
string_agg(column,,)
,但我没有运气让它工作。我总是遇到语法错误

我的尝试:

$repairs = DB::select(DB::raw('
                select r.id repair_id, string_agg(w.name, w.surname, ', ') workers
                    from repairs r
                        join repair_worker rw on r.id = rw.repair_id
                        join workers w on w.id = rw.worker_id
                    where r.vehicle_id = ?
                    group by r.id
          '),[$vehicle->id]);
你会怎么做


我正在使用最新的Postgresql 9+

使用
|
操作符执行字符串连接,然后聚合此结果

$repairs = DB::select(DB::raw("
    select r.id repair_id, string_agg(w.name || ' ' || w.surname, ', ') workers
    from repairs r
        join repair_worker rw on r.id = rw.repair_id
        join workers w on w.id = rw.worker_id
    where r.vehicle_id = ?
    group by r.id
    "),[$vehicle->id]);
试试这个

$repairs = DB::select(DB::raw("
                select r.id repair_id, string_agg(concat(w.name, ',',w.surname), ', ') workers
                    from repairs r
                        join repair_worker rw on r.id = rw.repair_id
                        join workers w on w.id = rw.worker_id
                    where r.vehicle_id = ?
                    group by r.id
          "),[$vehicle->id]);

要将w.name和w.lasname放在一个字段中,用逗号分隔,请使用
concat(w.name,,',w.lasname)
?..@VaoTsun,即MySQL。PostgreSQL使用
| |
@Barmar
| |
将使整个表达式为空。如果任何列为空,则concat将不为空。从另一个角度看,这两个与postgres一起工作的函数似乎都是受支持的函数。虽然我认为concat_ws(带分隔符的concat)在这里使用会更好。
concat_ws(',,w.name,w.lasname)
得到了这个错误
语法错误:7错误:输入行末尾的语法错误2:…选择r.id修复id,string_agg(w.name | | | | | | w.姓氏,^(SQL:select r.id修复id,string| | | | | | | | | | | | | | | | | | w
您必须转义字符串中的引号。使用您现在的代码,我得到以下
语法错误:7错误:未终止的引号字符串位于或接近“”)工人…
我不明白为什么。所有的引号似乎都匹配。@TofyStedth我想可能有多个工人被分配到一个修理厂,他想要一个逗号分隔的名单,列出他们所有的名字。不起作用。我遇到了一些类似于前面的错误。哦,等等,不。它也起作用。糟糕的是,我忘了将
'更改为
。抱歉。无论如何谢谢你的帮助。我也要检查一下concat函数。这些解决方案之间的主要区别是
w.name
w.姓氏
可以
NULL
。如果不能为NULL,那么
concat
|
是等价的。