2013-12-21 37 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