1

テーブル構造:

uid       : integer
answer_id : integer

どのuidが他のuidと同じ答えを持っているかを示すクエリを実行する必要があります。たとえば、次のテストデータがあります。

answer_id   uid
1           555
4           555
7           555
10          555
1           123
5           123
7           123
10          123

したがって、このデータから、それぞれが同じ方法で質問の3/4に回答したことがわかります。

同じ答えの3/4または4/4に一致するuidを表示するクエリを作成する方法に苦労しています。基本的に、私は75%(3/4)以上(4/4)の同様の回答を持つユーザーを見つけようとしています。

これはRubyonRailsアプリケーションの一部であるため、すべてのモデルを構築しています[User、UserAnswersなど]が、これはSQLクエリであり、必ずしもActiveRecordの一部ではないと想定しています。

4

2 に答える 2

3

このクエリは、すべてのユーザーが互いに共通している回答の数を示しています。

declare @uid int

select
  ans1.uid as user1,
  ans2.uid as user2,
  count(*)
from 
  ans ans1 inner join ans ans2
  on ans1.answer_id = ans2.answer_id
     and ans1.uid <> ans2.uid
where uid = @uid
group by user1, user2
having count(*)>0

これは、各ユーザーが回答した質問の数も示しています。

 select
  ans1.uid as user1,
  ans2.uid as user2,
  count(distinct ans1.answer_id) as total1,
  count(distinct ans2.answer_id) as total2,
  sum(case when ans1.answer_id = ans2.answer_id then 1 else 0 end) as common
from 
  ans ans1 inner join ans ans2 on ans1.uid <> ans2.uid
group by user1, user2
having count(*)>0

(この2番目のクエリは非常に遅くなる可能性があります)

于 2012-11-16T17:39:51.007 に答える
1

FThiellaの答えは機能します。ただし、デカルト積の結合を行う必要はありません。次のバージョンでは、このような複雑な結合なしで、同じカウントが生成されます。

select ans1.uid as user1,
       ans2.uid as user2,
       max(ans1.numanswers) as total1,
       max(ans2.numanswers) as total2,
       count(*) as common
from (select a.*, count(*) over (partition by uid) as numanswers,
      from UserAnswers a
     ) ans1 inner join
     (select a.*, count(*) over (partition by uid) as numanswers
      from UserAnswers a
     ) ans2
     on ans1.uid <> ans2.uid and
        ans1.answer_id = ans2.answer_id
group by ans1.uid, ans2.uid

他の回答と同様に、これには共通の回答がないユーザーのペアは含まれません。

于 2012-11-16T18:33:18.920 に答える