Sql 多行仅获取特定值
感觉这应该是一个相当简单的问题,但我正在努力找到解决办法 我们有三个表来创建问答系统。一个是问题,另一个是答案,然后第三个是最终存储用户选择的位置 问题表Sql 多行仅获取特定值,sql,sql-server,Sql,Sql Server,感觉这应该是一个相当简单的问题,但我正在努力找到解决办法 我们有三个表来创建问答系统。一个是问题,另一个是答案,然后第三个是最终存储用户选择的位置 问题表 QuestionID Question 1 What is your favorite color? 2 Where were you born? 答题台 AnswerID QuestionID Answer 1 1 Blue 2 1 Gr
QuestionID Question
1 What is your favorite color?
2 Where were you born?
答题台
AnswerID QuestionID Answer
1 1 Blue
2 1 Green
3 1 Yellow
4 2 USA
5 2 Africa
应答存储表
AnswerStoreID QuestionID AnswerID UserID
1 1 1 1
2 1 2 1
3 2 4 2
4 2 5 2
5 1 1 3
我想找到回答问题ID 1的用户ID为AnswerID 1,回答问题ID 2的用户ID为AnswerID 4
我觉得这很简单
SELECT UserID
FROM Question Q
INNER JOIN Answer A ON A.QuestionID = A.QuestionID
INNER JOIN AnswerStore AS ON AS.AnswerID = A.AnswerID
WHERE (AS.AnswerID = 1 AND AS.QuestionID = 1)
AND (AS.AnswerID = 2 AND AS.QuestionID = 4)
但这并不意味着什么。当用或
替换两个where语句之间的和
时,会得到两个答案都没有的结果,尽管这也是不需要的。我只想要那些回答了这两个问题的用户
然后,我用一些不同的连接进行了一个查询,以对每个问题进行查询,但我觉得这对于这个问题来说太复杂和沉重了,我想得太多了。这个问题有更简单的解决方法吗?--Edit----
实际上,在原始查询中甚至不需要连接:
SELECT t.UserID
FROM AnswerStore AS t
WHERE (t.AnswerID = 1 AND t.QuestionID = 1)
OR (t.AnswerID = 2 AND t.QuestionID = 4)
GROUP BY t.UserID
HAVING COUNT(*) = 2
----原始完整答案----
这实际上是一个相当常见的问题,每周出现几次。不幸的是,很难制定一个可重复/可搜索的问题作为参考
SELECT UserID
FROM Question Q
INNER JOIN Answer A ON A.QuestionID = A.QuestionID
INNER JOIN AnswerStore AS ON AS.AnswerID = A.AnswerID
WHERE (AS.AnswerID = 1 AND AS.QuestionID = 1)
OR (AS.AnswerID = 2 AND AS.QuestionID = 4)
GROUP BY UserID
HAVING COUNT(*) = 2
一般形式为:
SELECT A.a_id
FROM A
INNER JOIN B ON A.a_id = B.a_id
WHERE B.something IN ([list])
GROUP BY a_id
HAVING COUNT(*) = [length of list]
-- or in cases where B matches may be non-unique
-- HAVING COUNT(DISTINCT B.something) = [length of list]
----编辑----
实际上,在原始查询中甚至不需要连接:
SELECT t.UserID
FROM AnswerStore AS t
WHERE (t.AnswerID = 1 AND t.QuestionID = 1)
OR (t.AnswerID = 2 AND t.QuestionID = 4)
GROUP BY t.UserID
HAVING COUNT(*) = 2
----原始完整答案----
这实际上是一个相当常见的问题,每周出现几次。不幸的是,很难制定一个可重复/可搜索的问题作为参考
SELECT UserID
FROM Question Q
INNER JOIN Answer A ON A.QuestionID = A.QuestionID
INNER JOIN AnswerStore AS ON AS.AnswerID = A.AnswerID
WHERE (AS.AnswerID = 1 AND AS.QuestionID = 1)
OR (AS.AnswerID = 2 AND AS.QuestionID = 4)
GROUP BY UserID
HAVING COUNT(*) = 2
一般形式为:
SELECT A.a_id
FROM A
INNER JOIN B ON A.a_id = B.a_id
WHERE B.something IN ([list])
GROUP BY a_id
HAVING COUNT(*) = [length of list]
-- or in cases where B matches may be non-unique
-- HAVING COUNT(DISTINCT B.something) = [length of list]
您实际上看到了两组数据,回答问题ID 1的用户ID为AnswerID 1,回答问题ID 2的用户ID为AnswerID 4。因此,您可以将这些集合连接在一起,以查找两组数据中的用户标识:
SELECT UserID
FROM AnswerStore as1 INNER JOIN AnswerStore as2 ON as1.UserID = as2.UserID
AND as1.QuestionID = 1 AND as1.AnswerID = 1
AND as2.QuestionID = 2 AND as2.AnswerID = 4
您实际上看到了两组数据,回答问题ID 1的用户ID为AnswerID 1,回答问题ID 2的用户ID为AnswerID 4。因此,您可以将这些集合连接在一起,以查找两组数据中的用户标识:
SELECT UserID
FROM AnswerStore as1 INNER JOIN AnswerStore as2 ON as1.UserID = as2.UserID
AND as1.QuestionID = 1 AND as1.AnswerID = 1
AND as2.QuestionID = 2 AND as2.AnswerID = 4
将AND更改为OR。不能有一行同时具有两组值。请参阅我的说明的最后一部分。这将产生两个答案集都没有答案的关系fwiw,您的示例不包含您正在寻找的值。用户ID 1满足第一个条件,但第二个条件仅由用户ID 3满足。用户1满足我们希望查询拉取的条件。用户3不会这样做。因此问题就来了。我们只希望用户1出现。然而,如果我们像你建议的那样做一个“或”,我们将得到用户1和用户3。编辑:现在明白你的意思了。我调整了采样以满足我刚才描述的要求。谢谢将AND更改为OR。不能有一行同时具有两组值。请参阅我的说明的最后一部分。这将产生两个答案集都没有答案的关系fwiw,您的示例不包含您正在寻找的值。用户ID 1满足第一个条件,但第二个条件仅由用户ID 3满足。用户1满足我们希望查询拉取的条件。用户3不会这样做。因此问题就来了。我们只希望用户1出现。然而,如果我们像你建议的那样做一个“或”,我们将得到用户1和用户3。编辑:现在明白你的意思了。我调整了采样以满足我刚才描述的要求。谢谢