Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询,根据所选选项向请求建议某些资源_Sql_Sql Server - Fatal编程技术网

SQL查询,根据所选选项向请求建议某些资源

SQL查询,根据所选选项向请求建议某些资源,sql,sql-server,Sql,Sql Server,我试图根据用户的请求向他们推荐一些资源 这是我的5个资源表及其选项、请求和所选选项 Resource res_opt_junc Options req_opt_junc Request --------- ------------ ------- ------------ -------- Res_id res_id opt_id req_id Req_id opt

我试图根据用户的请求向他们推荐一些资源

这是我的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,它只有用户为请求编号1选择的选项之一

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"
这现在变成了与余数的关系除法。以下是解决此问题的一种方法:

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)
    AND a.cnt = (
        SELECT COUNT(*)
        FROM res_opt_junc
        WHERE res_id = a.res_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)

我认为这是一个问题

以下是解决此问题的一种方法:

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)
    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
    )

您是如何传递所选选项的?所选选项将进入req_opt_junc(连接)表。您能否提供一些示例数据和预期结果?是的,我是否应该发布它们,我是否应该编辑主要问题?是的,编辑问题。谢谢,但在显示每个具有请求选项之一的资源之前,我尝试了此操作,我需要让每个用户都在请求中选择选项的资源。@M Taher那么您是在接受两个输入吗?一个是请求id,另一个是选项id?@m另外,样本数据和预期结果将有助于澄清您的问题/i
m获取一个请求id和一个或多个选项id,并将它们存储在请求和请求选项连接表中,以便根据上述信息随时检索属于每个请求的选项,为了从资源表中选择正确的类,您必须同时拥有“请求id”和“选项id”。谢谢,我只是测试了您的查询和它的工作,我会再测试一下,稍后通知您没有问题。一定要读这篇文章。另外,使用“
而不是“for撇号”。对不起,这不起作用,我不需要精确匹配,我需要满足请求的资源,他们可能有更多选择,但至少他们有选择requested@MTaher,请参阅我的更新。您的问题不会变成RDWR而不是RDNR。感谢您的关注,感谢您在我执行新查询时抽出时间。错误:列“Resource.location”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。