单个MySQL表中的复杂比较和排除

时间:2013-12-21 03:11:42

标签: mysql sql database database-design

MySQL在这里:http://sqlfiddle.com/#!2/6094e8/6

小提琴包含下面我的例子中的数据。

我正在尝试使用单个表格:

表1:user_answers表(存储用户答案及其对各种问题的可接受的答案)

存储的值得注意的值是:

用户ID(列uid
他们正在回答的问题的问题ID(列quid
回答问题(专栏answer
可接受的答案存储#1存储该用户的其他可接受的答案(列acceptable_1
可接受的答案存储#2存储该用户的其他可接受的答案(列acceptable_2
可接受的答案存储#3存储该用户的其他可接受的答案(列acceptable_3
可接受的答案存储#4存储该用户的其他可接受答案(列acceptable_4
答案的重要性(专栏importance

答案列将存储1到4之间的值。

可接受的列包含选定的可接受答案,这些答案与其列位置一致。例如,用户1应答1,但会接受答案2和3.这将使acceptable_2 = 2acceptable_3 = 3成为acceptable_1acceptable_2,其值为0. / p>

为了举例,我将尝试解释我正在寻找的结果:

示例1:
用户1在quid 1上回答3,并接受来自另一个用户的同一问题的答案2和4。

用户2在quid 1上回答2,并接受来自另一个用户的同一问题的答案

示例1的结果: 用户1将接受用户2的回答,用户2将接受接受用户1的回答。该结果应从结果中排除。

示例2: 用户1在quid 2上回答2,并接受另一个用户对同一问题的答案1或4。

用户2在quid 2上回答2,并接受来自另一个用户的同一问题的答案2或4。

示例2的结果: 用户1不接受用户2的回答,但用户2将接受用户1的回答。这种比较中只有一个冲突,应该包含在结果中。

示例3: 用户1在quid 3上回答1,并接受来自另一个用户的同一问题的答案1或2。

用户2在quid 3上回答1,并接受来自另一个用户的同一问题的答案1或2.

示例3的结果: 用户1将接受用户2的回答,用户2将接受用户1的回答。没有冲突,应该从结果中排除这个结果。

示例4: 用户1在quid 4上回答1,并接受来自另一个用户的同一问题的答案1或2。

用户2在quid 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等)中使用我用来容纳每个用户可接受答案的别名,我还没有成功比较所有变量以获得预期的结果。

任何指导意见。

1 个答案:

答案 0 :(得分:0)

你需要这样的东西(使用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