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

时间:2013-12-17 23:35:53

标签: mysql sql database

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

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

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

存储的值得注意的值是用户ID(列uid),他们正在回答的问题的问题ID(列quid),问题的答案(列{{1 }}以及他们答案的重要性(专栏answer)。

我想要的最终结果:

我希望能够抓住任何两个用户已经回答的所有问题,不包括任何未被对方回答的问题的答案,或者回答同一问题的值为1的问题适用于importance中的任一用户。同样,这只会用于一次比较两个用户。

我的尝试一直很不成功,但这就是我尝试过的,只是将事情拼凑在一起:

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;

这给了我结果,但似乎因为连接而加倍。我也试图在这种尝试中消除任何相同的答案,这似乎在这个意义上起作用。

感谢任何指导。

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用聚合查询回答您的问题。我们的想法是使用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

答案 1 :(得分:0)

只是您需要的简单版本。

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