背景
我面临以下与三个表有关的问题
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 查询可以做到这一点???