如何执行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是好的,改进来自于对数据模型的重新审视
希望这对你有所帮助,祝你工作顺利 啊,显而易见!!!谢谢你花时间仔细考虑。非常好的回答。非常欢迎你,一个很好的灰色小细胞的工作!啊,显而易见!!!谢谢你花时间仔细考虑。非常好的回答。非常欢迎你,一个很好的灰色小细胞的工作!