MySQL查询选择特定资源

时间:2015-12-09 19:09:11

标签: php mysql

情境:

我工作的学校已经有一个处理资源预留的系统(有电视机,投影仪等的机架),但是由于系统出现问题我被要求快速修复,没有办法使资源仅针对特定细分显示:

1-6年级是一个部分,
7-11级是一个片段。

系统由PHP和MySQL构成。

问题:

如果不创建新表,我必须找到一种方法,只显示特定资源到1-3级,另一种只能到4-6级。

以下是表格:

enter image description here

我在评分表中添加了一个名为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

这是我无法弄清楚的部分。一些帮助将非常感谢!

修改

以下是资源的一些图片

资源: enter image description here

等级: enter image description here

用户中级(电子邮件在此图片中受到审查):

enter image description here

正如您所看到的,我想要完成的内容还包括GRADEID 13-24resourcelocationid = 5的资源,如果用户教授分数为1-3或4-6 < / p>

2 个答案:

答案 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