2

簡単な概要なので、これは文脈にあります。アプリケーションのデータベースとして SQL を使用する Java のアプリケーションがあります。ユーザーは質問への回答として 8 つの国を選択する必要があります (これらの国は複数回選択される場合があります。たとえば、オーストラリアは彼らのQ1とQ3の回答)

国 ID は、user_id と一緒に回答テーブルに保存されます。

回答として選択したすべての国名を取得するクエリを作成しようとしています (次に、Java アプリケーションで 8 つのラベルのテキストを設定して、ユーザーが回答として選択した 8 つの国を表示できるようにします)

私はSQL結合などに問題はありません。私が書いたクエリは正しい情報を引き出しますが、誰かが同じ回答(国)で複数の質問に回答した場合、回答された国名のみを返します(基本的には8が返されますただし、同じ国が 2 回選択された場合、返されるのは 7 のみです。これに関する問題は、異なるユーザーが同じ国で異なる質問に回答する可能性があるため、返された回答を単純に使用して、返された行の 1 つからの値で 2 つのラベルを設定できないことです。クエリで(意味があることを願っています)

ここに私のSQLがあります

SELECT C.C_NAME
FROM COUNTRY C INNER JOIN
TBL_ANSWERS T ON 
T.ANSWER1_ID = C.C_ID 
OR
T.ANSWER2_ID = C.C_ID 
OR
T.ANSWER3_ID = C.C_ID 
OR
T.ANSWER4_ID = C.C_ID 
OR
T.ANSWER5_ID = C.C_ID 
OR
T.ANSWER6_ID = C.C_ID 
OR
T.ANSWER7_ID = C.C_ID 
OR
T.ANSWER8_ID = C.C_ID
WHERE T.USER_ID = '4' 

おそらく私が見逃したかなり簡単なものがあると確信していますが、どんな助けも大いに感謝します

また、私の質問が完全に意味をなしていない場合は申し訳ありません。質問があれば喜んでお答えします。

ありがとう

4

1 に答える 1

1

次のようなものが必要なようです。

SELECT C_NAME, AnswerNum
FROM
(
SELECT C.C_NAME, "1" AS AnswerNum, T.USER_ID
FROM COUNTRY C 
    JOIN TBL_ANSWERS T 
        ON  T.ANSWER1_ID = C.C_ID 
UNION ALL
SELECT C.C_NAME, "2" AS AnswerNum, T.USER_ID
FROM COUNTRY C 
    JOIN TBL_ANSWERS T 
        ON  T.ANSWER2_ID = C.C_ID 
...
UNION ALL
SELECT C.C_NAME, "8" AS AnswerNum, T.USER_ID
FROM COUNTRY C 
    JOIN TBL_ANSWERS T 
        ON  T.ANSWER8_ID = C.C_ID 
) AS AnswersJoined
WHERE USER_ID = '4' 

ただし、関係マッピングテーブルを使用して質問と回答を把握できるように、テーブルを作り直すことを真剣に検討します。これにより、これを1つのクエリでより簡単に作成できるようになります

何かのようなもの

Tbl_Answer

 Question_Id|User_Id|Response_Id

Tbl_Question

 Id|QuestionNumber

これにより、単純なを実行することができますBETWEEN。このようなもの:

SELECT C.Name
FROM Country C
WHERE EXISTS
(
    SELECT 1 
    FROM Tbl_Answer T
        JOIN Tbl_Question Q
            ON Q.Id = T.Question_Id
    WHERE T.User_Id = 4 AND T.Response_Id = C.C_ID
        AND Q.QuestionNumber BETWEEN 1 AND 8
)
于 2012-04-17T18:10:09.230 に答える