PostgreSQL按指定field_id排序后多field_id条件过滤查询实现问题
PostgreSQL EAV结构表多条件过滤+指定排序实现方案
核心逻辑说明
你的表是典型的实体属性值(EAV)存储结构,每个registry_id对应多行不同field_id的属性数据,针对需求的实现逻辑如下:
- 过滤逻辑:需要按
registry_id聚合,判断同一个registry_id下的所有属性是否同时满足你传入的多组过滤规则 - 排序逻辑:提取每个
registry_id下指定field_id=N对应的value值作为排序依据
最终可直接使用的SQL
仅返回符合条件的registry_id(和你原有SQL输出一致)
SELECT registry_id FROM MyTableName GROUP BY registry_id -- 多组过滤条件在此处添加,每新增一组就加一行WHEN判断即可 HAVING BOOL_AND( CASE WHEN field_id = 第一个过滤字段id THEN value LIKE '%第一个模糊匹配值%' WHEN field_id = 第二个过滤字段id THEN value LIKE '%第二个模糊匹配值%' -- 更多过滤条件按上述格式扩展 ELSE TRUE END ) -- 替换N为你指定的排序用field_id ORDER BY MAX(CASE WHEN field_id = N THEN value END) ASC;
需要返回完整行数据的版本
如果需要输出符合条件的所有属性行,可使用窗口函数实现:
SELECT id, registry_id, field_id, value FROM ( SELECT *, BOOL_AND( CASE WHEN field_id = 第一个过滤字段id THEN value LIKE '%第一个模糊匹配值%' WHEN field_id = 第二个过滤字段id THEN value LIKE '%第二个模糊匹配值%' ELSE TRUE END ) OVER (PARTITION BY registry_id) AS is_meet_filter, MAX(CASE WHEN field_id = N THEN value END) OVER (PARTITION BY registry_id) AS sort_value FROM MyTableName ) temp WHERE is_meet_filter = TRUE ORDER BY sort_value ASC, id ASC;
参数替换说明
- 把示例中的
第一个过滤字段id/第一个模糊匹配值替换为你实际传入的过滤参数,多组条件依次新增即可 - 把
N替换为你指定用来排序的field_id数值即可
内容的提问来源于stack exchange,提问作者Imanali Mamadiev
相关产品推荐
相关产品推荐

