2013-12-17 72 views
6

MySQLFiddle這裏:http://sqlfiddle.com/#!2/15d447/1MySQL的加入表與自身比較結果

我有我試圖與工作單個表:

表1:user_answers表(存儲用戶解答各種問題)

存儲的值得注意的值是用戶id(列uid),他們正在回答的問題的問題ID(列quid),問題的答案(列answer)及其答案的重要性(列importance)。

最終的結果我想:

我希望能夠抓住所有,任何兩個用戶已回答的問題,但不包括問題,這要麼沒有得到回答了對方的任何答案,或對於importance中的任何一個用戶,回答同樣的問題的值爲1。再次,這將只用於一次比較兩個用戶。

我已經非常不成功的在我的嘗試,但這裏是我試過,只是拼湊的東西放在一起:

#attempt one: trying to exclude answers that were not answered by both users 
SELECT * FROM user_answers AS uid1 
JOIN user_answers AS uid2 ON uid1.uid = uid2.uid 
WHERE uid1.uid = 1 
AND uid2.uid = 20008 
AND uid1.quid IS NOT NULL 
AND uid2.quid IS NOT NULL; 

這不返回任何結果,但我不知道是什麼原因。

#attempt two: trying to exclude where answers are the same for both users 
SELECT * FROM user_answers AS uid1 
LEFT JOIN user_answers AS uid2 ON (uid1.uid = uid2.uid AND uid1.answer <> uid2.answer) 

這給了我的結果,但似乎因爲連接而加倍。我也試圖消除任何相同的答案,這似乎是在這個意義上的工作。

任何指導表示讚賞。

謝謝。

+3

+1。 。 。如何不能啓動一個以「我的SQL小提琴在這裏」開頭的問題? –

回答

3

您可以使用聚合查詢來回答您的問題。這個想法是使用having子句來篩選您正在查看的條件的行。

因爲你不感興趣的東西與importance = 1這些問題用where條款被過濾:

select ua.quid 
from user_answers ua 
where importance <> 1 and uid in (1, 20008) 
group by ua.quid 
having sum(uid = 1) > 0 and 
     sum(uid = 20008) > 0; 

如果您要包括的答案,你可以這樣做:

select ua.quid, 
     group_concat(concat(uid, ':', answer) order by uid) as answers 
+1

確實避免連接的好方法。我個人寧願將雙方的答案作爲單獨的列,'GROUP_CONCAT(IF(uid = 1,answer,'')SEPARATOR'')as a1,GROUP_CONCAT(IF(uid = 1,answer,'')) SEPARATOR'')as a2' – Wrikken

+0

哦,順便說一句,對於2個用戶,人們也可以有一個COUNT(distinct uid)= 2'而不是2'SUM'的 – Wrikken

+0

@cjaredrun。 。 。在'select'語句中'quid'後面缺少一個逗號。 –

0

剛一個你需要的簡單版本。

select * 
from user_answers a, 
     user_answers b 
where a.quid = b.quid 
    and a.uid <> b.uid 
    and 1 not in (a.importance, b.importance) 

如果你喜歡,只過濾出的問題,只是改變*distinct a.quid

看到它在這裏小提琴:http://sqlfiddle.com/#!2/15d447/15