[英]How to do a MYSQL conditional select statement
背景
我面临以下与三张桌子有关的问题
class_sectors
表包含三类类别
classes
表格包含学生可以参加的班级列表
class_choices
包含每个部门学生的第一,第二和第三等选择。 例如,对于扇区1,Student_A将class_1作为第一选择,将class_3作为第二选择,将class_10作为第三选择,然后对于扇区2,他具有另外三个选择,依此类推。
class_choices
表具有以下列:
kp_choice_id | kf_personID | kf_sectorID | kf_classID | preference | assigned
我认为列名是不言自明的。 preference
是1,2或3,而assigned
是一个布尔值设置为1,一旦我们审查了学生的选择和他们分到一个班。
问题 :
编写一个sql查询,告诉学生他们为每个部门分配的班级。 如果尚未分配他们的班级,则应默认显示他们的第一个首选项。
我实际上已经做到这一点,但使用两个(非常(肿的?)SQL查询,如下所示:
$choices = $db -> Q("SELECT
*, concat_ws(':', `kf_personID`, `kf_sectorID`) AS `concatids`
FROM
`class_choices`
WHERE
(`assigned` = '1')
GROUP BY
`concatids`
ORDER BY
`kf_personIDID` ASC,
`kf_sectorID` ASC;");
$choices2 = $db -> Q("SELECT
*, concat_ws(':', `kf_personID`, `kf_sectorID`) AS `concatids`
FROM
`class_choices`
WHERE
`preference` = '1'
GROUP BY
`concatids`
HAVING
`concatids` NOT IN (".iimplode($choices).")
ORDER BY
`kf_personID` ASC,
`kf_sectorID` ASC;");
if(is_array($choices2)){
$choices = array_merge($choices,$choices2);
}
现在$choices
确实有我想要的东西。
但是我敢肯定,有一种方法可以简化此过程,合并两个SQL查询,因此它要轻一些。
有某种可以执行此操作的条件SQL查询吗???
您的解决方案使用两个步骤来使您能够根据需要过滤数据。 由于您正在生成报告,因此即使看起来比您希望的更为冗长,这也是一种非常好的方法。
这种方法的优点是调试和维护容易得多,这是一大优点。
为了改善这种情况,您需要考虑数据结构本身。 当我查看class_choices
表时,我看到以下字段: kf_classID, preference, assigned
,其中包含键信息。
对于每个班级, assigned
字段为0(默认值)或1(当为学生分配班级偏好时)。 默认情况下, preference = 1
级preference = 1
的班级是已分配的班级,因为当您为特定部门中所有学生的班级选择assigned=0
时,您将其显示在报告中。
可以通过施加如下业务规则来改进数据模型:
对于preference=1
设置assigned=1
的默认值assigned=1
。 在进行班级选择过程时,如果为学生分配了第二或第三选择,则未分配首选项1,并且分配了替代选择。
这意味着应用程序中的代码会更多,但是使报告更加容易。
困难的根源在于分配过程没有明确分配第一偏好。 仅当学生无法获得第一选择时,它才会更新assigned
的内容。
总而言之,您的SQL很不错,而改进又来自于另一种数据模型。
希望这会有所帮助,并祝您工作顺利!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.