2013-12-21 69 views
0

MySQLfiddle這裏內部:http://sqlfiddle.com/#!2/6094e8/6令人費解的比較和排除單個MySQL表

小提琴包含下面我的例子伴隨而來的數據。

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

表1:user_answers表(存儲用戶的答案和他們的各種問題接受asnwers)

存儲出關注值是:

用戶ID(列uid
問題ID爲他們回答的問題(列quid
問題的答案(列answer
個 可接受的答案存儲#1存儲其它可接受的答案針對該用戶(列acceptable_1
可接受的答案存儲#針對該用戶(列acceptable_2
可接受的答案存儲#3存儲其它可接受的答案爲用戶2存儲其它可接受的答案(列acceptable_3
可接受的答案存儲#4存儲用於該用戶的其他可接受的答案(列acceptable_4)他們的答案的
重要性(列importance

答案欄將存儲之間的值1和4.

可接受的列保存與列位置一致的可接受答案。例如,用戶1回答1,但將接受答案2和3。這將使acceptable_2 = 2acceptable_3 = 3,留下acceptable_1acceptable_2與0

的值。例如起見,我會試着解釋結果我要找:

例1:
用戶對英鎊1 1分3的答案,並會從其他用戶對於同一個問題的答案接受2和4。

用戶2個回答2鎊1和將接受來自其他用戶的答案3同樣的問題

結果例1: 用戶1會接受用戶2的回答和用戶2會接受接受用戶1的回答。這個結果應該從結果中排除。

示例2: 用戶1回答2在quid 2,並會接受來自另一個用戶對同一問題的回答1或4。

用戶2回答2在quid 2,並會接受來自另一個用戶對同一問題的回答2或4。

例2的結果: 用戶1不會接受用戶2的回答,但用戶2會接受用戶1的回答。這個比較有一個單一的衝突,應該包含在結果中。

示例3: 用戶1回答1,並接受其他用戶對同一問題的回答1或2。

用戶2回答1在QID 3,並會接受來自另一個用戶對同一問題的答案1或2。

實例3的結果: 用戶1將接受用戶2的答案,並且用戶2將接受用戶1的答案。沒有衝突,這個結果應該排除在結果之外。

實施例4: 用戶上嚼食4 1個解答1和將接受來自另一用戶對同樣的問題的答案1或2。

用戶2在4號答案上回答3,並會接受來自另一個用戶針對同一問題的答案3或4。

例4的結果: 用戶1不接受用戶2的回答,用戶2不接受用戶1的回答。有兩個衝突,這個結果應該包含在結果中。

正如我希望看到的,我想抓住quid來解答用戶回答的問題,他們的回答在其他用戶可以接受的列中存在衝突。

到目前爲止,我已經能夠使用此查詢,收集每個用戶的答案和接受的答案:

select ua.quid, 
     GROUP_CONCAT(IF(uid=1,answer,'') SEPARATOR '') as a1, 
     GROUP_CONCAT(IF(uid=2,answer,'') SEPARATOR '') as a2, 
     GROUP_CONCAT(IF(uid=1,acceptable_1,'') SEPARATOR '') as ac1_1, 
     GROUP_CONCAT(IF(uid=1,acceptable_2,'') SEPARATOR '') as ac2_1, 
     GROUP_CONCAT(IF(uid=1,acceptable_3,'') SEPARATOR '') as ac3_1, 
     GROUP_CONCAT(IF(uid=1,acceptable_4,'') SEPARATOR '') as ac4_1, 
     GROUP_CONCAT(IF(uid=2,acceptable_1,'') SEPARATOR '') as ac1_2, 
     GROUP_CONCAT(IF(uid=2,acceptable_2,'') SEPARATOR '') as ac2_2, 
     GROUP_CONCAT(IF(uid=2,acceptable_3,'') SEPARATOR '') as ac3_2, 
     GROUP_CONCAT(IF(uid=2,acceptable_4,'') SEPARATOR '') as ac4_2 
from user_answers ua 
where importance <> 1 and uid in (1, 2) 
group by ua.quid 
having sum(uid = 1) > 0 and 
     sum(uid = 2) > 0 

不能夠使用我用的房子在每個用戶可接受的答案別名我WHERE子句(ac1_1等),我尚未成功比較所有變量以獲得預期結果。

任何指導讚賞。

+0

「表1」是否可以提供**更多**而不是2個用戶的信息? –

+0

@ PM77-1是的,它會存儲幾個用戶的信息,但我們一次只能比較兩個用戶。 – Jared

回答

1

你需要這樣的事情(使用SELF JOIN):

SELECT t1.quid, t1.uid As u1, t2.uid As u2 
FROM user_answers t1 
JOIN user_answers t2 ON t1.uid > t2.uid AND t1.quid = t2.quid AND 
    (FIELD(t1.answer, t2.acceptable_1, t2.acceptable_2, t2.acceptable_3, t2.acceptable_4) = 0 OR 
     FIELD(t2.answer, t1.acceptable_1, t1.acceptable_2, t1.acceptable_3, t1.acceptable_4) = 0) 
WHERE t1.importance <> 1 AND t2.importance <> 1 and t1.uid in (1, 2) AND t2.uid in (1, 2); 

正如你所看到的,問題的答案比較與FIELD函數來完成。

這是your Fiddle with my code