如何执行MYSQL条件选择语句

如何执行MYSQL条件选择语句,mysql,sql,Mysql,Sql,背景 我面临以下问题,与三个表有关 class\u扇区表包含三类类别 课程表包含学生可以参加的课程列表 class_选项包含学生针对每个部门的第一、第二和第三类选项。因此,对于1区,学生A有1班作为第一选择,3班作为第二选择,10班作为第三选择,然后对于2区,他有另外三个选择,等等 class\u选项表包含以下列: kp_choice_id | kf_personID | kf_sectorID | kf_classID | preference | assigned 我认为列名是不言自明的首

背景

我面临以下问题,与三个表有关

class\u扇区
表包含三类类别

课程
表包含学生可以参加的课程列表

class_选项
包含学生针对每个部门的第一、第二和第三类选项。因此,对于1区,学生A有1班作为第一选择,3班作为第二选择,10班作为第三选择,然后对于2区,他有另外三个选择,等等

class\u选项
表包含以下列:

kp_choice_id | kf_personID | kf_sectorID | kf_classID | preference | assigned
我认为列名是不言自明的<代码>首选项为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
,其中包含关键信息

对于每个班级,分配的
字段为0(默认值)或1(为学生分配班级首选项时)。默认情况下,
preference=1
的班级是指定的班级,因为您在报告中显示该班级时,
assigned=0
用于学生在特定部门的所有班级选择

数据模型可以通过实施如下业务规则进行改进:
对于
preference=1
设置默认值
assigned=1
。在选课过程中 发生,如果学生被分配第二个或第三个选项,则首选项1未分配,并分配备用选项

这意味着应用程序中的代码要多一些,但它使报告更容易一些

困难的根源在于分配过程没有明确地分配第一个首选项。仅当学生无法获得第一个选项时,才会更新分配的

总之,您的SQL是好的,改进来自于对数据模型的重新审视


希望这对你有所帮助,祝你工作顺利

您的解决方案使用两个步骤来根据需要过滤数据。因为您正在生成一个报告,所以这是一个非常好的方法,即使它看起来比您希望的要详细一点

这种方法的优点是调试和维护更容易,这是一个很大的优点

为了改善这种情况,你需要考虑数据结构本身。当我查看
class_choices
表时,我会看到以下字段:
kf_classID、preference、assigned
,其中包含关键信息

对于每个班级,分配的
字段为0(默认值)或1(为学生分配班级首选项时)。默认情况下,
preference=1
的班级是指定的班级,因为您在报告中显示该班级时,
assigned=0
用于学生在特定部门的所有班级选择

数据模型可以通过实施如下业务规则进行改进:
对于
preference=1
设置默认值
assigned=1
。在选课过程中 发生,如果学生被分配第二个或第三个选项,则首选项1未分配,并分配备用选项

这意味着应用程序中的代码要多一些,但它使报告更容易一些

困难的根源在于分配过程没有明确地分配第一个首选项。仅当学生无法获得第一个选项时,才会更新分配的

总之,您的SQL是好的,改进来自于对数据模型的重新审视


希望这对你有所帮助,祝你工作顺利

啊,显而易见!!!谢谢你花时间仔细考虑。非常好的回答。非常欢迎你,一个很好的灰色小细胞的工作!啊,显而易见!!!谢谢你花时间仔细考虑。非常好的回答。非常欢迎你,一个很好的灰色小细胞的工作!