繁体   English   中英

MySQL将表连接到自身并比较结果

[英]MySQL joining table to itself and comparing results

MySQLFiddle在这里: http ://sqlfiddle.com/#!2/15d447/1

我有一个要处理的表:

表1: user_answers表(存储用户对各种问题的答案)

存储的值得注意的值是用户id(column uid ),他们正在回答的问题的问题id(column quid ),问题的答案(column answer )以及其答案的重要性(column 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;

这不会返回任何结果,但是我不确定为什么。

#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)

这给了我结果,但是由于加入,似乎一切都加倍了。 我还尝试过消除所有相同的答案,似乎在这个意义上是可行的。

任何指导表示赞赏。

谢谢。

您可以使用汇总查询回答您的问题。 这个想法是使用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;

如果要包括答案,可以执行以下操作:

select ua.quid,
       group_concat(concat(uid, ':', answer) order by uid) as answers

只是您需要的简单版本。

select *
 from user_answers a,
      user_answers b
where a.quid = b.quid
  and a.uid <> b.uid
  and 1 not in (a.importance, b.importance)

如果您只想过滤问题,只需将*更改为distinct a.quid

在小提琴上看到它: http ://sqlfiddle.com/#!2/ 15d447/15

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM