我正在尝试构建一个从表 form_submission_values 中提取记录的查询,该表在以下结构中将所有名称/值对并排存储:
SubmissionValueId | SubmissionId | FieldName | FieldValue
所以我需要在表格中查找FieldName ='payment'和FieldValue ='stripe'的所有记录,以提取与Stripe支付的提交相关的所有记录。我此后需要使用SubmissionIds列表从相同的表中提取所有名称/值对,其中包含其中一个SubmissionIds - 所以我想知道是在同一个表上的连接?通俗地说,而不是数据库查询,它将是:
从 form_submission_values
使用每个SubmissionIds拉出所有其他FieldName和FieldValues(也来自 form_submission_values )的列表,其中“SubmissionId”与列表中的一个匹配
< / LI>非常感谢任何指导。
编辑包括澄清:
以下是数据的存储方式以及我(理想情况下)如何访问数据。
数据存储在“表单提交数据”表中,如下所示:
SubmissionValueId | SubmissionId | FieldName | FieldValue
171991 | 10,727 | name | Mr Person
171992 | 10,727 | payment | stripe
171993 | 10,727 | email | person@email.com
171994 | 10,727 | total | 180.00
171995 | 10,727 | _STATUS | 1
171996 | 10,728 | name | Mr Man
171997 | 10,728 | payment | stripe
171998 | 10,728 | email | person2@email.com
171999 | 10,728 | total | 150.00
172000 | 10,728 | _STATUS | -1
172001 | 10,729 | name | Mrs Lady
172002 | 10,729 | payment | offline
172003 | 10,729 | email | person3@email.com
172004 | 10,729 | total | 120.00
172005 | 10,729 | _STATUS | 1
172006 | 10,730 | name | Mrs Person
172007 | 10,730 | payment | stripe
172008 | 10,730 | email | person4@email.com
172009 | 10,730 | total | 125.00
172010 | 10,730 | _STATUS | 1
我需要做的是为每个“email”,“person”和“total”字段提取值,其中关联的“payment”字段值(由具有相同“SubmissionId”值的相关联)设置为“stripe”和关联的“_STATUS”字段值设置为“1”。这将过滤掉任何没有按条款付款的人以及任何通过Stripe付款但付款未成功的人。
因此,使用上述数据,理想情况下会返回以下内容:
Submissionid | Name | Email | Total
10,727 | Mr Person | person@email.com | 180.00
10,730 | Mrs Person | person4@email.com | 125.00
答案 0 :(得分:1)
自我加入可行,但简单的子选择也是如此。
SELECT
SubmissionValueId,
SubmissionId,
FieldName,
FieldValue
FROM
Submission
WHERE
SubmissionId IN (
SELECT SubmissionId
FROM Submission
WHERE FieldName = 'payment' AND FieldValue = 'stripe'
)
除SubmissionId, SubmissionValueId
以上的主要索引外,此查询的辅助索引超过FieldName, FieldValue, SubmissionId
会很有帮助。
答案 1 :(得分:0)
要显示同一行的所有结果您应该多次连接同一个表
select c.Submissionid, c.FieldValue Name, d.FieldValue Email , e.FieldValue Total
from form_submission_values c
inner join (
select a.SubmissionId
from form_submission_values a
inner join form_submission_values b
on b.FieldName= '_STATUS'
AND b.FieldValue = '1'
AND a.FieldName = 'payment'
and a.FieldValue = 'stripe'
and a.SubmissionId = b.SubmissionId
) t on t.SubmissionId = c.Submissionid
inner join form_submission_values d on d.SubmissionId = c.Submissionid
and d.FieldName = 'email'
and c.FieldName = 'name'
inner join form_submission_values e on e.SubmissionId = c.Submissionid
and e.FieldName = 'total'