2015-09-08 30 views
0

我試圖根據他們的請求向我的用戶提供一些資源。通過選擇選項向請求建議某些資源的SQL查詢

這裏是我的5臺的資源和他們的選擇和要求,選擇的選項

Resource  res_opt_junc Options req_opt_junc Request 
--------- ------------ ------- ------------ -------- 
Res_id  res_id   opt_id  req_id   Req_id 
      opt_id      opt_id     

我收到請求,並根據用戶選擇的選項,我想是能夠滿足要求的用戶選擇的選項資源。

爲了簡化,我希望資源至少具有所有請求選擇的選項。

一些樣本數據應該是這樣的

Resource  res_opt_junc  Options   req_opt_junc  Request 
---------- ------------  ------------  ------------- -------- 
id name  res_id opt_id opt_id name  req_id opt_id  req_id 
1 class1  1  1  1  internet  1  1   1 
       1  2  2  projector 1  2   

2 class2  2  1        2  1   2 

所以這裏是一些數據, 例如,如果用戶需要的必須選項1(互聯網)類和2(投影機)我需要建議的Class1但不是CLASS2只能有選擇的請求數量選擇用戶後OP的評論1

+0

你是如何通過所選擇的選擇? –

+0

所選選項進入req_opt_junc(聯結)表。 –

+0

你能提供一些樣品數據和預期結果嗎? –

回答

0

編輯之一:

這現在已經成爲關係與餘下的部門。這是解決這個的一種方法:

SELECT r.id, r.name 
FROM res_opt_junc ro 
INNER JOIN(
    SELECT opt_id 
    FROM res_opt_junc 
    WHERE res_id = @req_id 
)t 
    ON t.opt_id = ro.opt_id 
INNER JOIN Resource r 
    ON r.id = ro.res_id 
GROUP BY r.id, r.name 
HAVING 
    COUNT(t.opt_id) = (
     SELECT COUNT(*) 
     FROM res_opt_junc 
     WHERE res_id = @req_id 
    ) 

另一種解決方案:

DECLARE @req_id INT = 1 

DECLARE @opts TABLE(opt_id INT PRIMARY KEY); 
INSERT INTO @opts 
    SELECT opt_id 
    FROM req_opt_junc 
    WHERE req_id = @req_id 

SELECT r.* 
FROM (
    SELECT 
     res_id, cnt = COUNT(DISTINCT opt_id) 
    FROM res_opt_junc 
    WHERE opt_id IN(SELECT opt_id FROM @opts) 
    GROUP BY res_id 
)a 
INNER JOIN Resource r 
    ON r.id = a.res_id 
WHERE 
    a.cnt = (SELECT COUNT(*) FROM @opts) 

我相信這是一個Relational Division with no Remainder (RDNR)問題。

SQL Fiddle

這裏是解決這個的一種方法:

DECLARE @req_id INT = 1 

DECLARE @opts TABLE(opt_id INT PRIMARY KEY); 
INSERT INTO @opts 
    SELECT opt_id 
    FROM req_opt_junc 
    WHERE req_id = @req_id 

SELECT r.* 
FROM (
    SELECT 
     res_id, cnt = COUNT(DISTINCT opt_id) 
    FROM res_opt_junc 
    WHERE opt_id IN(SELECT opt_id FROM @opts) 
    GROUP BY res_id 
)a 
INNER JOIN Resource r 
    ON r.id = a.res_id 
WHERE 
    a.cnt = (SELECT COUNT(*) FROM @opts) 
    AND a.cnt = (
     SELECT COUNT(*) 
     FROM res_opt_junc 
     WHERE res_id = a.res_id 
    ) 

如果你不想使用表變量:

SELECT r.* 
FROM (
    SELECT 
     res_id, cnt = COUNT(DISTINCT opt_id) 
    FROM res_opt_junc 
    WHERE opt_id IN(
     SELECT opt_id 
     FROM req_opt_junc 
     WHERE req_id = @req_id 
    ) 
    GROUP BY res_id 
)a 
INNER JOIN Resource r 
    ON r.id = a.res_id 
WHERE 
    a.cnt = (
     SELECT COUNT(*) 
     FROM req_opt_junc 
     WHERE req_id = @req_id 
    ) 
    AND a.cnt = (
     SELECT COUNT(*) 
     FROM res_opt_junc 
     WHERE res_id = a.res_id 
    ) 
+0

謝謝你,我只是測試你的查詢和它的工作,我會再測試一下,稍後我會通知你 –

+0

沒問題。一定要閱讀文章。另外,使用'''而不是'作爲撇號。 –

+0

對不起,但這不起作用,我不需要一個完全匹配,我需要資源,滿足要求,他們也許有更多的選擇,但至少他們有要求的選項 –

0
SELECT res_id FROM req_opt_junc AS rqoj 
LEFT JOIN res_opt_junc AS rsoj ON rsoj.opt_id = rqoj.opt_id 
WHERE rqoj.req_id = "request id goes here" 
AND rqoj.opt = "option id goes here" 
+0

謝謝,但我試過這之前它顯示每個資源有一個請求的選項,我需要資源,讓每個用戶選擇請求中的選項。 –

+0

@M塔赫,你需要兩個輸入?一個是請求ID,另一個是選項ID? –

+0

@Mather,再次,樣本數據和預期的結果將有助於澄清您的問題/ –