0

特定の質問に対する可能な回答をリストした回答の表があります。

possible_answer 
id question_id text
1  1           yes
2  1           no
3  2           red
4  2           blue
5  2           green

次に、ユーザーが与えた回答の表があります

user_answer
id user_id answer_id 
1  10      1
2  10      3
3  11      1
4  11      4
5  12      2
6  12      5

ユーザー名、質問 1 に対するユーザーの回答 (null の可能性があります)、および質問 2 に対するユーザーの回答 (null の可能性があります) を表示する MySQL クエリを作成しようとしています。複数の LEFT JOINS をグループ化する必要があるように感じて行き詰まりましたが、答えの 1 つ、または両方の列に同じ答えを与える出力を取得しています。

この時点で私が持っているものは次のとおりです。

SELECT u.name, pa1.text, pa2.text
FROM user u
LEFT JOIN user_answer ua1 ON u.id = ua1.user_id 
LEFT JOIN possible_answer pa1 ON ua1.answer_id = pa1.id AND pa1.question_id = 1
LEFT JOIN user_answer ua2 ON u.id = ua2.user_id 
LEFT JOIN possible_answer pa2 ON ua2.answer_id = pa2.id AND pa2.question_id = 2
GROUP BY u.id;

次のような結果を得ています。

username  pa1.text  pa2.text
user1     yes       NULL
user2     no        NULL
user3     NULL      blue

特定のユーザーの両方の質問にエントリがあることがわかっている場合。

私がgroup byそこに持っていなかったとき、私はgroup byこのような結果を得ていたので(これは意図した結果に少し近いです)、どのタイプのパターンも示していないようでした:

username  pa1.text  pa2.text
    user1     yes       NULL
    user1     NULL      red
    user2     no        NULL
    user2     NULL      NULL
    user3     no        NULL
    user3     NULL      blue

どんな考えでも大歓迎です。

4

5 に答える 5

0

多分これはあなたの後のものに近いです...

Select UA.User_ID, PA.Question_ID, UA.Answer_ID, PA.Text
FROM Possible_Answer PA
LEFT JOIN user_Answer UA on PA.ID = UA.Answer_ID
ORDER BY PA.Question_ID, UA.User_ID

考えられるすべての回答、ユーザーが質問に提供した回答、およびテキストを返します。ただし、ユーザーごとに質問と回答を繰り返します。

于 2013-02-14T20:16:56.553 に答える
0

私はSQLServerを使用しているので、SQLServerの構文を使用してクエリを記述します。しかし、同じクエリがMySQLでも機能すると確信しています(いくつかの変更がある可能性があります)。

必要に応じて結果を取得するには、行データを列に変換する必要があります。SQL Serverでは、CASEステートメントを使用できます(Oracle DECODE、MySQLは不明ですが、CASEも多分)

クエリは

SELECT u.Name, 
MAX(CASE WHEN pa1.QuestionID=1 THEN pa1.Text ELSE NULL END) AS Question1_answer,
MAX(CASE WHEN pa1.QuestionID=2 THEN pa1.Text ELSE NULL END) AS Question2_answer
FROM Users u
LEFT JOIN UserAnswers ua1 ON ua1.UserID=u.ID
LEFT JOIN PossibleAnswers pa1 ON pa1.ID=ua1.AnswerID
GROUP BY u.Name

1行に質問が必要なため、名前でグループ化するので、名前でグループ化して追加します

MAX(...) 

回答の列に1人のユーザーの回答を1行にグループ化します

ここに、同じ状況を作成しようとしたSqlFiddlerへのリンクがあります http://sqlfiddle.com/#!3/b2357/10

于 2013-02-14T20:53:25.147 に答える
0

可能性が 2 つしかない場合は、次のトリックを使用できます。

select ua.user_id,
       min(pa.text) as answer1,
       (case when min(pa.text) <> max(pa.text) then max(pa.text) end) as answer2
from possible_answer pa join
     user_answer ua
     on pa.id = ua.answer_id
group by ua.user_id

これにより、 の ID に基づく順序が失われuser_answerます。順序付けが重要な場合は、min(id)andmax(id)を元に戻してpossible_answer正しい値を取得します。

于 2013-02-14T20:24:02.733 に答える
0

これはハックに近いことはわかっていますが、動的クエリで機能する可能性があります。

select z.username, w.text as PA1, x.text as PA2
from user z 
join
    (select a.user_id, b.question_id, b.text, a.answer_id
    from
    user_answer a join possible_answer b on a.answer_id=b.id) as w
    on w.user_id=z.user_id 
    and w.question_id=1

join
    (select a.user_id, b.question_id, b.text, a.answer_id
    from
    user_answer a join possible_answer b on a.answer_id=b.id) as x
    on x.user_id=z.user_id 
    and x.question_id=2
于 2013-02-14T20:52:24.463 に答える
0

これが最終的に機能したものです。

SELECT DISTINCT u.name,

(SELECT pa1.text FROM possible_answer pa1, user_answer ua WHERE ua1.user_id = u.id AND ua1.answer_id = pa1.id AND pa1.question_id = 1 ORDER BY ua1.id DESC LIMIT 1) as 'Question1',

(SELECT pa2.text FROM possible_answer aa2, user_answer ua2 WHERE ua2.user_id = u.id AND ua2.answer_id = pa2.id AND pa.question_id = 2 ORDER BY ua.id DESC LIMIT 1) as 'Question2'

FROM user u  
GROUP BY u.id;
于 2013-03-18T16:05:40.117 に答える