1

すべて、次の mySQL テーブル構造があります。

テーブル dj_feedback_answers: answer_id、gig_id、question_id、answer_id
テーブル dj_feedback_summary: summary_id、user_id、gig_date、tip、summary、why_poor、why_fair
テーブル dj_feedback_questions: question_id、question_value、question_display
テーブル dj_feedback_ratings: rating_id、rating_value、rating_display

私は基本的にユーザーに質問をしています。質問は dj_feedback_questions テーブルに保存され、質問ごとに評価を付けることができます。評価は dj_feedback_ratings に保存されます。

各フォームにはさまざまな質問を含めることができるため、質問を送信すると、回答が dj_feedback_answers に保存されます。フォームには他にも静的フィールドがあり、それらは dj_feedback_summary に svaed されます。summary_id と gig_id は、ユーザーが送信した回答の 2 つのテーブルを接続するキーです。

これは、dj_feedback_summary テーブルの 1 つの行に対して、dj_feedback_answers に複数の行が存在する可能性があることを意味します。

私がやりたいことは、基本的に結果を PHP テーブルで利用できるようにすることです。したがって、結果を次のようにしたいと思います (dj_feedback_questions テーブルに 3 つの質問があると仮定します)。

summary_id、user_id、gig_date、tip、summary、why_poor、why_fair、question_1、question_2、question_3
1, 2, 2012/07/23, 5, これはまとめです, 悪かったです, 普通でした, 3, 4, 5

質問に対して保存される値は、dj_feedback_answers からの answer_id です。

結果を取得するために、次のクエリを作成しようとしました。これは問題なく動作しますが、すべての質問ではなく、1 つの質問しか表示できません。

Select dj_feedback_summary.summary_id, 
       dj_feedback_summary.user_id, 
       dj_feedback_summary.gig_date, 
       dj_feedback_summary.tip, 
       dj_feedback_summary.summary,  
       dj_feedback_answers.question_id, 
       dj_feedback_answers.rating_id, 
       dj_feedback_questions.question_value, 
       users.first_name, users.last_name, 
       dj_feedback_ratings.rating_value
from dj_feedback_summary
join dj_feedback_answers on dj_feedback_summary.summary_id=dj_feedback_answers.gig_id
join dj_feedback_questions on dj_feedback_answers.question_id=dj_feedback_questions.question_id 
join users on dj_feedback_summary.user_id=users.user_id
join dj_feedback_ratings on dj_feedback_ratings.rating_id=dj_feedback_answers.rating_id
where dj_feedback_questions.question_value='Overall Gig'
order by dj_feedback_summary.summary_id DESC

クエリを変更して、結果を希望どおりに返す方法はありますか?

どんなアドバイスでも大歓迎です!

ありがとう

4

1 に答える 1

1

複数の行の値を表示する必要があり、それらが別々の列にあることが必須ではない場合は、MySQL GROUP CONCAT 関数が目的に適している可能性があります。

これによりquestion_1、 、question_2、およびquestion_3値が 1 つの列に連結されます (出力の意図が正しく理解されている場合)。

更新:より「本物の」ピボット (さまざまな質問への回答をさまざまな列に分ける) を行うには、次のいずれかの方法を使用できます。

1) 複数のテーブル エイリアスを使用します。dj_feedback_questionsたとえば、次の行に沿って、質問ごとに 1 回テーブルに参加します。

SELECT [...] FROM [...]
LEFT JOIN dj_feedback_questions q1 on q1.question_id = 1
LEFT JOIN dj_feedback_questions q2 on q2.question_id = 2
LEFT JOIN dj_feedback_questions q3 on q2.question_id = 3

dj_feedback_answers次に、a)同様に (エイリアスを使用して複数回) に結合する必要がありquestion_idます。 a のJOIN代わりに定期的にLEFT JOIN実行すると、1 つ以上の質問に対する回答がない要約の行が失われます。

2)IFブロックを使用して列に分割します。例については、この SO の質問 (特に受け入れられた回答) を参照してください: mysql クエリ行を列に転置します。

于 2012-07-23T19:53:21.963 に答える