Laravel使用selectRaw结合GROUP_CONCAT与DISTINCT ON时报不支持错误如何解决
问题原因
- 你当前使用的是PostgreSQL数据库,
GROUP_CONCAT是MySQL专属的聚合函数,PostgreSQL不支持该函数,这是触发报错的核心原因。 - 原有写法逻辑存在冲突:
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
相关产品推荐
相关产品推荐

