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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:54:04