SQL查询,根据所选选项向请求建议某些资源
我试图根据用户的请求向他们推荐一些资源 这是我的5个资源表及其选项、请求和所选选项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
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子句中。