如何自连接form_submission_values表查询Stripe支付相关记录?
实现思路与SQL示例
当然可以通过自连接来完成这个需求!这其实是处理这类**实体-属性-值(EAV)**结构表时非常常见的操作场景,完全适配你的查询需求。
自连接版本的SQL语句
SELECT sv_all.* FROM form_submission_values sv_all JOIN form_submission_values sv_stripe ON sv_all.SubmissionId = sv_stripe.SubmissionId WHERE sv_stripe.FieldName = 'payment' AND sv_stripe.FieldValue = 'stripe';
代码逻辑解释
- 我们给同一张表起了两个别名:
sv_stripe专门用来筛选出所有使用Stripe支付的提交ID,sv_all则用来获取这些ID对应的所有名称/值对。 - 自连接的核心条件是两张表的
SubmissionId相等,这样就能精准关联到符合支付方式要求的提交的所有关联数据。 - 如果你的表存在重复的键值对记录,想要去重的话,可以在
SELECT后加上DISTINCT:SELECT DISTINCT sv_all.*。
替代方案:子查询
要是你觉得自连接的写法不够直观,也可以用子查询实现,效果完全一致:
SELECT * FROM form_submission_values WHERE SubmissionId IN ( SELECT SubmissionId FROM form_submission_values WHERE FieldName = 'payment' AND FieldValue = 'stripe' );
两种方案的性能差异主要取决于你的表数据量和索引配置,建议给SubmissionId、FieldName和FieldValue字段建立合适的联合索引,能大幅提升查询效率。
内容的提问来源于stack exchange,提问作者Simon Logan
相关产品推荐
相关产品推荐

