2017-03-18 28 views
0

我有一個名爲questions的表,其中包含useridquestionid列,所以表中的一行表示具有該表的用戶已回答了一個特定問題。我想編寫一個查詢來爲表中的每個用戶返回一個未答覆的問題。如何整理這個SQL查詢?

一個例子是:

userid | questionid 
------------------- 
1  | 3 
1  | 4 
2  | 1 
2  | 4 
3  | 2 

而且我想返回

userid | questionid 
------------------- 
1  | 1 
2  | 2 
3  | 1 

從原來的表,你可以推斷出可用的問題是1,2,3和4用戶1只回答問題3和4,所以我想推薦回答問題1,用戶2回答問題1,所以我想推薦他們回答問題2,等等。

我有以下幾點:

SELECT q1.userid, 
(SELECT MIN(q2.questionid) 
    FROM questions q2 
    WHERE questionid NOT IN 
      (SELECT q3.questionid 
      FROM questions q3 
      WHERE q3.userid = q1.userid)) 
FROM questions q1 

但這令我爲相當混亂/低效。有沒有更好的方法來解決這個問題?

+0

未解答的問題是什麼樣的?它是否與用戶ID一致,並且沒有問題?或者相反呢?或者是其他東西? – Hana

+0

未解答的問題將不會有行 - 表中只包含回答的問題。 – bigsim

+0

你說'爲每個用戶返回一個未答覆的問題。'你的意思是用戶沒有回答的問題,還是沒有人回答的問題? – Bango

回答

0

您可以通過執行返回所有懸而未決的問題:

SELECT u.userid, uq.questionid 
FROM users u CROSS JOIN 
    questions q LEFT JOIN 
    userquestions uq 
    ON uq.userid = u.userid and uq.questionid = q.questionid 
WHERE uq.userid is null; 

(注:我修改的表名,使他們更有意義的表稱爲questions不應該是一個結表。)

但是,如果你只是想每個用戶一個,我會建議相關子查詢:

select u.*, 
     (select q.questionid 
     from questions q left join 
      userquestion uq 
      on uq.questionid = q.questionid and 
       uq.userid = u.userid 
     where uq.userid is null 
     order by rand() -- strictly optional 
     limit 1 
     ) as random_unasked_question 
from users u; 
0

我會APPR如下所示(SQL Server)。公共表表達式q和u實際上應該是表格(一個表格僅用於問題,一個表格僅供用戶使用,留下原始「問題」表格以模擬它們之間的多對多關係)。 unanswered cte計算問題用戶的完整笛卡爾乘積與實際表格之間的集合差異。

; with 
q as (select distinct questionid from questions) 
, u as (select distinct userid from questions) 
, unanswered as (
select u.userid, q.questionid 
from u, q 
except 
select questions.userid, questions.questionid 
from questions 
    ) 
select userid, min(questionid) 
from unanswered 
group by userid