情境:
我工作的学校已经有一个处理资源预留的系统(有电视机,投影仪等的机架),但是由于系统出现问题我被要求快速修复,没有办法使资源仅针对特定细分显示:
1-6年级是一个部分,
7-11级是一个片段。
系统由PHP和MySQL构成。
问题:
如果不创建新表,我必须找到一种方法,只显示特定资源到1-3级,另一种只能到4-6级。
以下是表格:
我在评分表中添加了一个名为UNIQUERESOURCES
的新列,其中我将1
的值放在first and third grade
和值2
之间的各个部分之间{ {1}}。
我如何才能向1 - 3年级的成绩展示这些特定资源,以及4-6年级的其他特定资源?
以下是当前查询:
fourth and sixth grade
如何修复此查询以包含资源,如下所示:
如果用户位于SELECT DISTINCT r.RESOURCEID, r.RESOURCENAME, rl.RESOURCELOCATIONNAME FROM resource r
inner join resource_location rl
on r.RESOURCELOCATIONID = rl.RESOURCELOCATIONID
inner join grade g
on g.RESOURCELOCATIONID = r.RESOURCELOCATIONID
inner join users_intermediate ui
on g.GRADEID = ui.GRADEID
WHERE ui.USERID = '%s'
之间,则RESOURCELOCATIONID = 5
包括UNIQUERESOURCES = 1
如果用户位于GRADEID 1-12
之间,则RESOURCELOCATIONID = 6
包括UNIQUERESOURCES = 2
。
这是我无法弄清楚的部分。一些帮助将非常感谢!
修改
以下是资源的一些图片
用户中级(电子邮件在此图片中受到审查):
正如您所看到的,我想要完成的内容还包括GRADEID 13-24
或resourcelocationid = 5
的资源,如果用户教授分数为1-3或4-6 < / p>
答案 0 :(得分:0)
你试过这种方式:
SELECT RESOURCEID, RESOURCENAME, RESOURCEDESCRIPTION,
T3.RESOURCELOCATIONNAME, T2.RESOURCESTATUSNAME,
T2.RESOURCESTATUSDESCRIPTION, T2.RESOURCESTATUSID
FROM resource T1
INNER JOIN resource_status T2 USING(RESOURCESTATUSID)
INNER JOIN resource_location T3 USING(RESOURCELOCATIONID)
INNER JOIN grade USING(RESOURCELOCATIONID)
WHERE T1.RESOURCELOCATIONID IN (
SELECT DISTINCT RESOURCELOCATIONID FROM grade G
INNER JOIN users_intermediate UI
ON G.GRADEID = UI.GRADEID
WHERE USERID = "%s"
)
AND (
T1.RESOURCESTATUSID = 1
OR (
T1.RESOURCELOCATIONID = 5
AND (
UNIQUERESOURCES = 1 AND GRADEID >= 1 AND GRADEID <= 12
)
)
OR (
T1.RESOURCELOCATIONID = 6
AND (
UNIQUERESOURCES = 2 AND GRADEID >= 13 AND GRADEID <= 24
)
)
)
答案 1 :(得分:0)
没有看到样本数据并确认您的数据和预期输出的真实背景,我想通过传递关联进行心理描述。
用户“A”与班级/ 1,2和3级相关联。
查看成绩表,您会发现用户“A”具有指向位置“LH”,“LR”和“LX”的成绩信息(任意不会混淆等级为1-3或4-的位置6(或以后需要的其他))。
由于我们知道合格的“地点”,因此用户“A”可以访问在“LH”,“LR”和“LX”位置找到的ANYTHING。
现在,因为ResourceLocationID同时位于Resource_Location和Resource表中,所以Grade表实际上可以直接连接到每个,因为资源位置表只是一个查找,以获取它的位置的描述性名称。房间里的多件事都是资源。
因此,我的内部预先查询“QualGroups”所做的唯一事情是获取用户有权访问的UniqueResources组(1或2)的列表。下一级是将所有DISTINCT位置置于该1或2状态下。因为如果用户访问位于“LH”的组1和位于“LH”的类组2,则不希望重复的资源用于位置“LH”。我正在获取位置名称。 (结果为别名QualLocations)
现在,我可以为那些不同的合格位置获取资源
SELECT
QualLocations.ResourceLocationID,
QualLocations.ResourceLocationName,
R.ResourceID,
R.ResourceName,
R.ResourceDescription,
R.ResourceStatusID
from
( SELECT distinct
RL.ResourceLocationID,
RL.ResourceLocationName
from
grade G2
JOIN ( select distinct
G.UniqueResources
from
users_intermediate UI
JOIN grade G
ON UI.GradeID = G.GradeID
where
UI.UserID = "%s" ) QualGroups
ON G2.UniqueResources = QualGroups.UniqueResources
JOIN Resource_Location RL
ON G2.ResourceLocationID = RL.ResourceLocationID )
as QualLocations
JOIN Resource R
ON QualLocations.ResourceLocationID = R.ResourceLocationID
现在,如果您只关注一个非常具体的分类组,请更新加入“等级G”表的最内层查询,以包含您要查找的唯一资源...在这种情况下为1或2
JOIN grade G
ON UI.GradeID = G.GradeID
AND G.UniqueResource = 1 (or 2 if you only wanted 4th-6th grade)
希望这可以帮助你。
除了上面发布的问题之外,如果您将“UniqueResource”更改为具有特定GRADE的数值,那么它与等级名称的措辞描述相比,上面的AND子句可以简化为类似
AND G.UniqueResource IN ( 1, 2, 3 ) // for only grades 1-3
AND G.UniqueResource BETWEEN 1 and 6 // ex: for grades 1-6
AND G.UniqueResource > 6 // for any grade above 6th grade