2

简要概述所以这是在上下文中,我有一个使用 SQL 作为应用程序中的数据库的应用程序用户必须选择 8 个国家作为问题的答案(这些国家可能会被多次选择,例如澳大利亚可能是他们的Q1 和 Q3 的答案)

然后将国家 ID 与他们的 user_id 一起保存到他们的答案表中

我正在尝试编写一个查询,该查询将获取他们选择作为答案的所有国家/地区名称,(然后我将在我的 java 应用程序中设置 8 个标签的文本,以便用户可以看到他们选择作为答案的 8 个国家/地区)

我对 SQL 连接等没有任何问题,我编写的查询确实提取了正确的信息,但是如果有人用相同的答案(国家)回答了多个问题,那么它只返回作为答案的国家名称(所以基本上我希望返回 8但是如果同一个国家被选择了两次,它只返回 7) 这个问题是不同的用户可能会在同一个国家回答不同的问题,所以我不能简单地使用返回的答案并使用返回的行之一中的值设置 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' 

但是,我会认真考虑重新设计您的表格,以便您使用关系映射表来找出问题和答案。这将允许在一个查询中更轻松地创建它

就像是

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 回答