JOIN表本身?

时间:2018-02-27 16:55:35

标签: mysql join

我正在尝试构建一个从表 form_submission_values 中提取记录的查询,该表在以下结构中将所有名称/值对并排存储:

SubmissionValueId | SubmissionId | FieldName | FieldValue

所以我需要在表格中查找FieldName ='payment'和FieldValue ='stripe'的所有记录,以提取与Stripe支付的提交相关的所有记录。我此后需要使用SubmissionIds列表从相同的表中提取所有名称/值对,其中包含其中一个SubmissionIds - 所以我想知道是在同一个表上的连接?通俗地说,而不是数据库查询,它将是:

  • form_submission_values

  • 中拉出FieldName为“payment”且FieldValue设置为“stripe”的所有记录的SubmissionIds列表
  • 使用每个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

2 个答案:

答案 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'