You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel使用selectRaw结合GROUP_CONCAT与DISTINCT ON时报不支持错误如何解决

问题原因

  1. 你当前使用的是PostgreSQL数据库,GROUP_CONCAT是MySQL专属的聚合函数,PostgreSQL不支持该函数,这是触发报错的核心原因。
  2. 原有写法逻辑存在冲突:DISTINCT ON的作用是取每个drug_code分组下的第一条单条记录,而聚合函数需要对整个分组的所有记录做计算,未加GROUP BY的情况下聚合函数会把所有查询结果合并为一行,和你要按drug_code分组输出的需求不符。另外你调整后的代码中GROUP_CONCAT(...) as dosage和display_flag之间缺少逗号,也会触发语法错误。

解决方法

PostgreSQL中实现多行字符串拼接的内置函数是STRING_AGG(字段名, 分隔符),根据你的业务场景可以选择以下两种方案:

方案一:使用GROUP BY+STRING_AGG(推荐,性能更优)

如果同一个drug_code对应的bbr_drug_id、hospital_id、drug_name、display_flag字段值均相同,直接用分组聚合即可:

$all_drugs = HmsBbrKnowledgebaseDrug::selectRaw('
    bbr_drug_id,
    hospital_id,
    drug_code,
    drug_name,
    STRING_AGG(drug_dosage, \',\') as dosage,
    display_flag
')
->groupBy('drug_code', 'bbr_drug_id', 'hospital_id', 'drug_name', 'display_flag')
->orderBy('drug_code', 'ASC')
->get();

方案二:DISTINCT ON配合子查询

如果同一个drug_code对应的其他字段值可能不同,你需要保留DISTINCT ON取每个分组第一条其他字段的逻辑,可以通过子查询单独拼接每个drug_code的所有剂量:

$all_drugs = HmsBbrKnowledgebaseDrug::selectRaw('
    DISTINCT ON (drug_code)
    bbr_drug_id,
    hospital_id,
    drug_code,
    drug_name,
    (SELECT STRING_AGG(drug_dosage, \',\') 
     FROM hms_bbr_knowledgebase_drug d2 
     WHERE d2.drug_code = hms_bbr_knowledgebase_drug.drug_code) as dosage,
    display_flag
')
->orderBy('drug_code', 'ASC')
->get();

内容的提问来源于stack exchange,提问作者user16409170

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:36:03