MySQLFiddle:http://sqlfiddle.com/#!2/15d447/1
我有一个我正在尝试使用的表:
表1:user_answers表(存储用户对各种问题的答案)
存储的值得注意的值是用户id(列uid),他们正在回答的问题的问题ID(列quid),问题的答案(列answer)以及他们答案的重要性(列importance).
我想要的最终结果:
我希望能够抓住任何两个用户已回答的所有问题,排除任何未被对方回答的问题的答案,或对任一用户的值为1的同一问题的答案在importance.同样,这将仅用于一次比较两个用户.
在我的尝试中,我一直很不成功,但这是我尝试过的,只是拼凑在一起:
#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;
Run Code Online (Sandbox Code Playgroud)
这没有返回任何结果,但我不确定为什么.
#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)
Run Code Online (Sandbox Code Playgroud)
这给了我结果,但似乎因为连接而加倍.我也试图在这种尝试中消除任何相同的答案,这似乎在这个意义上起作用.
任何指导表示赞赏.
谢谢.
您可以使用聚合查询来回答您的问题。这个想法是使用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;
Run Code Online (Sandbox Code Playgroud)
如果您想包含答案,您可以执行以下操作:
select ua.quid,
group_concat(concat(uid, ':', answer) order by uid) as answers
Run Code Online (Sandbox Code Playgroud)