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 = 2
和acceptable_3 = 3
成为acceptable_1
和acceptable_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等)中使用我用来容纳每个用户可接受答案的别名,我还没有成功比较所有变量以获得预期的结果。
任何指导意见。
答案 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
函数完成的。