使用SELECT DISTINCT查询drug_code时合并同编码下全部drug_dosage的方法
解决方案
你需要同时修改后端Laravel查询逻辑和前端渲染代码,操作步骤如下:
1. 修改Controller查询代码
原有查询存在两处逻辑问题:
- 使用了
groupBy('bbr_drug_id'),而bbr_drug_id是表主键,每条记录值唯一,无法实现按drug_code分组的效果 distinct('drug_code')在搭配group by的场景下不需要额外使用,直接通过分组聚合即可实现去重+合并字段的需求
修改后的代码如下:
public function fetchdrug(Request $search_drug){ $filter_drug = $search_drug->input('search_drug'); $all_drugs = HmsBbrKnowledgebaseDrug::selectRaw('drug_code, drug_name, GROUP_CONCAT(distinct drug_dosage SEPARATOR ", ") as merged_dosage') ->when(is_null($filter_drug), function ($query) { $query->where('bbr_drug_id', '>=', 1); }) ->when(!empty($filter_drug), function ($query) use ($filter_drug) { $query->where('drug_name', 'iLIKE', "%$filter_drug%"); }) ->groupBy('drug_code', 'drug_name') ->get(); return response()->json([ 'all_drugs'=>$all_drugs, ]); }
注:如果你使用的是PostgreSQL数据库,把
GROUP_CONCAT(distinct drug_dosage SEPARATOR ", ")替换为string_agg(distinct drug_dosage, ', ') as merged_dosage即可
2. 修改前端表格渲染代码
把原前端中「Additional Information」列的渲染值替换为后端返回的合并后字段即可:
<td class="p-1"><p class="font-weight-bold m-0">Additional Information:</p> ${drug.merged_dosage} </td>
可选调整说明
- 聚合函数里加了
distinct是为了避免同个drug_code下出现重复的dosage值,如果业务需要保留重复值可以去掉 - MySQL的GROUP_CONCAT默认有长度限制,如果你的dosage值非常多,可以在SQL中临时调整
group_concat_max_len参数适配
内容的提问来源于stack exchange,提问作者user16409170
相关产品推荐
相关产品推荐

