Gravity Forms数据库:行转列后查找field_7重复条目SQL查询
查找Gravity Forms中field_7字段重复的条目
我明白你遇到的问题了——直接在行转列查询末尾加筛选条件很容易因为聚合逻辑的冲突导致失效,咱们换个思路,分步骤来实现就能解决这个问题。
首先得明确Gravity Forms的存储逻辑:主表wp_rg_lead存条目的基础信息(比如ID、创建时间、状态),而wp_rg_lead_detail是以行形式存储每个字段的键值对,field_number对应字段ID,value是字段内容。
方案一:用CTE分步实现(推荐,逻辑清晰)
这个方法先定位重复的field_7值,再行转列筛选对应条目,完全避开逻辑冲突:
WITH duplicate_field7_values AS ( -- 第一步:找出所有重复的field_7值(出现次数>1) SELECT value FROM wp_rg_lead_detail WHERE field_number = 7 GROUP BY value HAVING COUNT(*) > 1 ), lead_as_columns AS ( -- 第二步:把行存储的字段转成列结构,按需添加你需要的字段 SELECT l.id AS lead_id, l.date_created, l.status, MAX(CASE WHEN d.field_number = 1 THEN d.value END) AS field_1, MAX(CASE WHEN d.field_number = 7 THEN d.value END) AS field_7, MAX(CASE WHEN d.field_number = 12 THEN d.value END) AS field_12 -- 继续添加其他需要展示的字段,格式同上 FROM wp_rg_lead l JOIN wp_rg_lead_detail d ON l.id = d.lead_id GROUP BY l.id, l.date_created, l.status ) -- 第三步:只保留field_7属于重复值列表的条目 SELECT * FROM lead_as_columns WHERE field_7 IN (SELECT value FROM duplicate_field7_values) ORDER BY field_7, lead_id;
方案二:简化关联查询(适合不需要太多列的场景)
如果只需要展示少量字段,也可以直接用关联查询实现,更简洁:
SELECT l.id AS lead_id, l.date_created, l.status, d7.value AS field_7, d1.value AS field_1 -- 按需添加其他字段 FROM wp_rg_lead l -- 关联field_7的字段值 JOIN wp_rg_lead_detail d7 ON l.id = d7.lead_id AND d7.field_number = 7 -- 按需关联其他字段 LEFT JOIN wp_rg_lead_detail d1 ON l.id = d1.lead_id AND d1.field_number = 1 -- 筛选出field_7值存在重复的条目 WHERE d7.value IN ( SELECT value FROM wp_rg_lead_detail WHERE field_number = 7 GROUP BY value HAVING COUNT(*) > 1 ) ORDER BY d7.value, lead_id;
为什么之前修改最后一行会失效?
你之前的问题大概率是直接在行转列的GROUP BY后面加了HAVING条件,比如HAVING COUNT(CASE WHEN d.field_number=7 THEN 1 END) >1——这个逻辑其实是检查单个条目里field_7出现的次数,而不是该field_7值在所有条目里的重复次数,完全搞反了逻辑,所以才会失效。咱们先找出重复的字段值,再筛选对应条目,这才是正确的思路。
内容的提问来源于stack exchange,提问作者michaelp
相关产品推荐
相关产品推荐

