3

次のデータベース設計に問題があります (例のために単純化されています)。これにより、Google スプレッドシート フォームと非常によく似たカスタム フォームを作成できます。データベースへの回答の保存を含め、フォーム生成スクリプトが実行されます。ユーザー入力の表示に問題があります。

テーブルフォーム(各フォームはこのテーブルの行です)

form_id | form_name
1         Contact Form
2         BBQ sign up Form

表の質問(フォーム内の質問)

question_id | form_id | question_name      | sorting_order
1             1         Full Name            1
2             1         E-mail address       2
3             1         Subject              3
4             1         Message              4
5             2         Your name            1
6             2         Are you vegetarian?  2
7             2         Beer or wine?        3    

table completed_forms (回答をグループ化するため)

complete_id | form_id | timestamp
1            1          1339496914
2            1          1148691493
3            2          1256235334

表の回答(特定の質問に対するユーザーからの回答)

answer_id | complete_id | question_id | answer
1           1             1             Barack Obama
2           1             2             president@whitehouse.gov
3           1             3             Test message
4           1             4             This is a test. Regards, Barack.
5           2             1             Thomas something
6           2             2             thomas@email.com
7           2             3             Another message
8           2             4             Hey, it's Thomas. This is my message.
9           3             5             Dirk
10          3             6             No, I love meat
11          3             7             Red wine!

表示したいのはユーザー入力の概要です。名前と列の数がフォームごとに異なるため、これは非常に複雑です。たとえば、お問い合わせフォーム (form_id: 1) からのユーザー入力を次のように表示したいとします。

id | timestamp | Full Name | E-mail Address | Subject | Message
1    133949...   Barack...   president@w...   Test...   This is a t...
2    114869...   Thomas...   thomas@emai...   Anot...   Hey, it's T...

そして、次のように form_id 2 から:

id | timestamp | Your name | Are you vegetarian? | Beer or Wine?
3    125623...   Dirk        No, I love meat       Red wine!

私がこれを達成できるかどうか、またどのように達成できるかは誰にもわかりますか?

この問題に光を当てるために時間を割いてくれる人に感謝します!

4

2 に答える 2

3

基本的に PIVOT を作成しようとしていますが、MySQL には PIVOT 関数自体がないため、クエリを少し異なる方法で作成する必要があります。質問の値をコーディングするこのクエリの静的バージョンでは、次を使用できます。

フォーム 1 ( SQL Fiddle with Demoを参照):

select cf.complete_id
  , cf.ts
  , Min(CASE WHEN q.question_name = 'Full Name' THEN a.answer END) as 'Full Name'
  , Min(CASE WHEN q.question_name = 'Email Address' THEN a.answer END) as 'Email Address'
  , Min(CASE WHEN q.question_name = 'Subject' THEN a.answer END) as 'Subject'
  , Min(CASE WHEN q.question_name = 'Message' THEN a.answer END) as 'Message'
from completed_forms cf
inner join questions q
  on cf.form_id = q.form_id
inner join answers a
  on cf.complete_id = a.complete_id
  and q.question_id = a.question_id
where cf.form_id = 1
group by cf.complete_id

フォーム 2 ( SQL Fiddle with Demoを参照):

select cf.complete_id
  , cf.ts
  , Min(CASE WHEN q.question_name = 'Your Name' THEN a.answer END) as 'Your Name'
  , Min(CASE WHEN q.question_name = 'Are you vegetarian?' THEN a.answer END) as 'Are you vegetarian?'
  , Min(CASE WHEN q.question_name = 'Beer or Wine' THEN a.answer END) as 'Beer or Wine'
from completed_forms cf
inner join questions q
  on cf.form_id = q.form_id
inner join answers a
  on cf.complete_id = a.complete_id
  and q.question_id = a.question_id
where cf.form_id = 2
group by cf.complete_id

質問はフォームごとに変わるため、ピボットの自動化を検討する必要があります。ここにある記事を確認することをお勧めします。

http://www.artfulsoftware.com/infotree/queries.php#523

MySql でピボットを使用する方法の例が含まれています。これを動的に記述するのに役立つはずの StackOverflow に関する他の回答もあります。

行データを列に動的に変換するmysqlクエリ

単一列データに基づく動的ヘッダーを持つ MySQL ピボット テーブル

于 2012-06-12T11:44:09.023 に答える
1

素晴らしい正規化されたスキーマ!

これを純粋な SQL で行うのは非常に困難です。

純粋な SQL でそれを行っていた場合、form_id の個別の値ごとに SQL ステートメントを何らかの形で記述する SQL ステートメントを作成することになります。これは、SQL コードで保守不可能なモンキー ビジネスにつながります。長期的なコストの観点から、複数のフォームを簡単に処理できるようにするために行った作業が完全に吹き飛ばされます。

これは、PHP、PERL、Java、または文字列のリストを操作する適切な仕事を行う他の言語で行う方がはるかに簡単です。

PostgreSQL と Oracle では、ストアド プロシージャを Java や PERL などの言語で記述できます。このコードを DBMS に常駐させる必要がある場合は、この方法が適している可能性があります。

于 2012-06-12T11:18:35.643 に答える