gpt4 book ai didi

mysql - 如何做一个MYSQL条件选择语句

转载 作者:行者123 更新时间:2023-11-29 00:33:37 25 4
gpt4 key购买 nike

背景

我遇到了以下与三个表有关的问题

class_sectors 表包含三个类别的类

classes 表包含学生可以参加的类(class)列表

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 是一个 bool 值,一旦我们审查了学生的选择并将他们分配给了一个类(class),就会设置为 1。

问题:

编写一个 sql 查询,告诉学生他们被分配到每个部门的哪个类(class)。如果他们的类(class)没有被分配,它应该默认显示他们的第一偏好。

我实际上已经让它工作了,但是使用了两个(非常臃肿??)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 其中包含关键信息。

对于每个类(class),assigned 字段为 0(默认)或 1(当为学生分配了类(class)偏好时)。默认情况下,preference = 1 的类(class)是分配的类(class),因为当您在报告中显示它时 assigned=0 用于特定部门中所有学生的类(class)选择。

可以通过强加如下业务规则来改进数据模型:
对于 preference=1,设置默认值 assigned=1。当类选择过程发生,如果学生被分配到第二或第三选择,则取消分配偏好 1 并分配替代选择。

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

困难的根源在于分配过程没有明确分配第一个偏好。如果学生无法获得第一选择,它只会更新 assigned

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

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

关于mysql - 如何做一个MYSQL条件选择语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15375339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com