[英]Multiple rows get only specific values
感覺這應該是一個相當簡單的問題,我正在努力尋找解決方案。
我們有三個表來創建一個問答系統。 一個是問題,另一個是答案,然后第三個是我們存儲用戶選擇的最終位置。
問題表
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
我想找到回答 QuestionID 1 作為 AnswerID 1和QuestionID 2 作為 AnswerID 4 的 UserID。
以為會像這樣簡單
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)
但這沒有任何效果。 當用OR
替換兩個 where 語句之間的AND
,得到的結果沒有這兩個答案,盡管這也是不希望的。 我只想要那些回答這兩個問題的用戶。
然后我做了一個帶有一些不同連接的查詢來對每個問題進行查詢,但覺得這個問題太復雜和繁重了,我想多了。 這個問題有更簡單的解決方案嗎?
- - 編輯 - -
實際上,您甚至不需要原始查詢中的 JOIN:
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]
您實際上是在查看兩組數據,將 QuestionID 1 回答為 AnswerID 1 的 UserID,以及將 QuestionID 2 回答為 AnswerID 4 的 UserID。因此,您可以將這些集連接在一起以查找在兩組數據中的 UserID:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.