繁体   English   中英

如何执行MYSQL条件选择语句

[英]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 = 1preference = 1的班级是已分配的班级,因为当您为特定部门中所有学生的班级选择assigned=0时,您将其显示在报告中。

可以通过施加如下业务规则来改进数据模型:
对于preference=1设置assigned=1的默认值assigned=1 在进行班级选择过程时,如果为学生分配了第二或第三选择,则未分配首选项1,并且分配了替代选择。

这意味着应用程序中的代码会更多,但是使报告更加容易。

困难的根源在于分配过程没有明确分配第一偏好。 仅当学生无法获得第一选择时,它才会更新assigned的内容。

总而言之,您的SQL很不错,而改进又来自于另一种数据模型。

希望这会有所帮助,并祝您工作顺利!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM