2012-11-16 23 views
1

表結構:在數據庫使某列等於行使用SQL

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以同樣的方式看到。

我正在努力如何編寫一個查詢,它會告訴我哪個uid匹配3/4或4/4的相同答案。基本上我試圖找到75%(3/4)或更多(4/4)類似答案的用戶。

這是一個Ruby on Rails應用程序的一部分,所以我有機型全部建[用戶,UserAnswers等],但我假設這將只是一個SQL查詢,不一定是ActiveRecord的

的一部分
+0

出於好奇 - 測試者選擇正確答案時是否會出現大量的誤報? –

+0

沒有正確的答案 - 這不是一個真正的測試,只是一系列問題。 –

回答

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

我想添加'有數量(*)> 0'到底:) – pkuderov

+0

@pkuderov是的,謝謝!這可能是一個好主意:) – fthiella

+0

這看起來很接近我要去的地方。我不需要user2,因爲我會過濾掉當前用戶。我只需要匹配當前用戶的用戶,所以我調整了一下。 –

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 

與其他的答案,這並不包括對,沒有共同的答案的用戶。

+0

我不需要知道兩個觀看的用戶,我會匹配當前用戶與其他類似用戶,所以我只需要返回uid和count。我無法獲得此代碼的工作。 –

+0

假設查詢引擎正確地優化了SQL,只查看一個用戶會使交叉連接少一個問題。我在查詢中修復了幾個拼寫錯誤,所以它應該可以工作。 –

+0

仍然收到語法錯誤。該表的名稱是UserAnswers。你對錶格的別名混淆了我,所以我不確定哪個查詢應該調用實際的表或哪個參與子查詢?困惑。 –

相關問題