2016-12-17 14 views
0

私は、私のワードプレスサイトでカルデラフォームを使用して、私たちのクラブの新しい入会のためのデータを収集しています。フォームは期待通りに機能します。私は開いているアプリケーションの一覧とそれらを表示するページを表示しようとしています。以下は、私のSQLテーブルエントリ(cf_form_entries)です。SQLの結果に基づいて行を表示する

+----+-----------------+--------+ 
| ID | Form ID   | Status | 
+----+-----------------+--------+ 
| 1 | CF5852c23e56b1d | active | 
+----+-----------------+--------+ 
| 2 | CF5852c23e56b1d | active | 
+----+-----------------+--------+ 
| 3 | CF5852c23e56b1d | active | 
+----+-----------------+--------+ 

次の表には、フォーム(cf_form_entry_values)によって提出されたすべての情報が含まれています。

+----+----------+---------------+--------------------+ 
| id | entry_id |  slug  |  value  | 
+----+----------+---------------+--------------------+ 
| 1 |  1 | branch  | Branch A   | 
| 2 |  1 | full_name  | asdasd asdasd  | 
| 3 |  1 | email_address | [email protected] | 
| 4 |  1 | phone   | 111111111   | 
| 5 |  2 | branch  | Branch A   | 
| 6 |  2 | full_name  | Full Name   | 
| 7 |  2 | email_address | [email protected] | 
| 8 |  2 | phone   | 111111111   | 
| 9 |  3 | branch  | Branch A   | 
| 10 |  3 | full_name  | Namwe    | 
| 11 |  3 | email_address | [email protected] | 
| 12 |  3 | phone   | 111111111   | 
+----+----------+---------------+--------------------+ 

私は、単純なselectクエリを実行し、与えられた枝、内側の参加テーブルの開いているアプリケーションの詳細を取得することができます。

SELECT cf_form_entries.id, 
     cf_form_entries.form_id, 
     cf_form_entries.status, 
     cf_form_entry_values.slug, 
     cf_form_entry_values.value 
FROM cf_form_entry_values 
    INNER JOIN cf_form_entries 
    ON cf_form_entry_values.entry_id = cf_form_entries.id 
WHERE cf_form_entry_values.slug = 'branch' 
    AND cf_form_entry_values.value LIKE '%Branch A%' 

上記のクエリ結果は次の表のとおりです。

+----+-----------------+--------+--------+----------+ 
| id |  form_id  | status | slug | value | 
+----+-----------------+--------+--------+----------+ 
| 1 | CF5852c23e56b1d | active | branch | Branch A | 
| 3 | CF5852c23e56b1d | active | branch | Branch A | 
+----+-----------------+--------+--------+----------+ 

私の質問は、ある私はなど、選択したテーブルの名前、電子メールアドレス、など(エコー)その他の詳細を表示するにはどうすればよいですか?

このように私の最終結果は、開いているアプリケーションのすべての詳細を表に表示するものとします。 (ブランチ名だけでなく)

私はwhileループを試しました。しかし、私は内側の結合テーブルで選択された唯一のデータであるので、ブランチ名をエコーすることができます。

+0

これらのレコード名、電子メールアドレスなどはどのテーブルにありますか? –

+0

@AmitKumarSahu、私が言ったように、彼らは 'cf_form_entry_values'にあります – Sid

答えて

2

一つの方法は、条件付きの集合体である:

SELECT fe.id, fe.form_id, fe.status, 
     MAX(CASE WHEN fev.slug = 'branch' THEN fev.value END) as branch, 
     MAX(CASE WHEN fev.slug = 'full_name' THEN fev.value END) as full_name, 
     . . . 
FROM cf_form_entries fe INNER JOIN 
    cf_form_entry_values fev 
    ON fev.entry_id = fe.id 
GROUP BY fe.id, fe.form_id, fe.status; 

このアプローチの良い点は、新しい値を追加するには、SELECTに新しい式を追加する必要があることです。

+0

1つのブランチに起因する結果を選択できるように、どのように 'WHERE'を追加できますか? – Sid

+0

私はどこに追加しようとし、空の結果で終わった。代わりに 'HAVING'を使用することを検討してください。 – Sid

+0

@Sid。 。 。 'HAVING branch = ??'となります。 –

1

2つのテーブルでLEFT JOINを使用してクエリを試してください。

SELECT cfev.*,cfm.Form ID as entry_id 
    FROM cf_form_entry_values cfev 
     LEFT JOIN cf_form_entries cfm ON cfm.id = cfev.entry_id 
      WHERE cfev .slug = 'branch' AND vfm.value LIKE '%Branch A%' 

これはお役に立ちます。そして、あなたは適切な出力を取得...

1

これはあなたの最初の2つの値を与える必要があり、あなたは残りの部分と同じパターンを使用することができます。

SELECT entries.id, 
     entries.form_id, 
     entries.status, 
     (SELECT value FROM cf_form_entry_values as v 
     WHERE slug='branch' and entry_id=entries.entry_id) as branch, 
     (SELECT value FROM cf_form_entry_values as v 
     WHERE slug='full_name' and entry_id=entries.entry_id) as full_name 
FROM cf_form_entry_values 
INNER JOIN (
    SELECT * FROM cf_form_entry_values 
    INNER JOIN cf_form_entries 
    ON cf_form_entry_values.entry_id = cf_form_entries.id 
    WHERE cf_form_entry_values.slug = 'branch' 
    AND cf_form_entry_values.value LIKE '%Branch A%' 
) as entries 
    ON cf_form_entry_values.entry_id = entries.id 
GROUP BY cf_form_entries.id