mysql - 仅当每个元素都满足条件时才选择组

标签 mysql ms-access

我有这样简单的数据库方案:Child one----many SchoolPreferences

子表包括:

ChildId, Name, Surname, Age

SchoolPreferences 包括:

PreferenceId, ChildId, PreferenceNumber, SchoolName

这是为了招聘到学校。每个 child 最多可以选择 3 所他们想去的学校。如果他们在 PreferenceNumber 1 中被接受,那么他们会去 那所学校,如果他们不符合条件,他们会进入 PreferenceNumber 2,如果他们在那里失败,那么他们最后的机会就是进入第三优先学校。

我需要选择仅被选为 PreferenceNumber 1 的学校。因此,如果任何 child 选择学校作为 PreferenceNumber 2 或 3,则该学校根本不应出现在结果中。

到目前为止,我只知道如何选择单个行,但我需要的是过滤组,因此每个学校都是一个组,如果任何偏好 > 1,那么整个组不应出现在结果中。

到目前为止我有这个,但正如我所说,它只适用于个别行,不适用于学校:

select SchoolPreferences.PreferenceId,
    Children.name,
    Children.Surname
from Children
inner join SchoolPreferences on Children.ChildId = SchoolPreferences.ChildId
group by SchoolPreferences.PreferenceId,
    Children.name,
    Children.Surname
having (((SchoolPreferences.PreferenceNumber) = 1));

最佳答案

反连接模式可以解决问题。不需要 child 表。看起来我们拥有的学校唯一标识符是 schoolname

如果我理解规范,返回学校列表 (schoolname),它仅作为 preferencenumber 1 出现,而​​没有作为任何其他 preferencenumber 出现...

像这样:

 SELECT p1.schoolname
   FROM SchoolPreferences p1
   LEFT
   JOIN SchoolPreferences pn
     ON pn.schoolname = p1.schoolname
    AND pn.preferencenumber <> 1
  WHERE pn.schoolname IS NULL
    AND p1.preferencenumber = 1
  GROUP
     BY p1.schoolname

还有其他返回等效结果的查询模式,例如

 SELECT p1.schoolname
   FROM SchoolPreferences p1
  WHERE p1.preferencenumber = 1
    AND NOT EXISTS 
        ( SELECT 1
            FROM SchoolPreferences pn
           WHERE pn.schoolname = p1.schoolname
             AND pn.preferencenumber <> 1
        )
  GROUP
     BY p1.schoolname

如果我们希望将学校作为 preferencenumber 1 的 child 包括在内,我们删除 GROUP BY,然后我们可以连接到 Children

 SELECT p1.schoolname

      , p1.preferenceid
      , p1.childid
      , ch.name
      , ch.surname

   FROM SchoolPreferences p1

   JOIN Children ch
     ON ch.childid = p1.childid

   LEFT
   JOIN SchoolPreferences pn
     ON pn.schoolname = p1.schoolname
    AND pn.preferencenumber <> 1
  WHERE pn.schoolname IS NULL
    AND p1.preferencenumber = 1

  ORDER
     BY p1.schoolname
      , p1.childid

关于mysql - 仅当每个元素都满足条件时才选择组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43019280/

相关文章:

MySQL:执行这些多批处理 INSERT 的最佳方法是什么?

MySQL:Slow Drop table 命令

php - 如何在 laravel 中进行连接查询

excel - 报告连接到值的行和列名称 (Microsoft Access)

c# - Access 数据库上的更新查询不工作 C#.NET

php - mySQL请求过多如何准备?

mysql - 如果 MySQL 中不存在,是否可以使用没有主键的 where-in 子句来更新或插入?

vba - 网络文件路径无法在 VBA/MS Access 中打开

c# - INSERT INTO 语句 MS Access 中的语法错误(不是关键字问题)

java - 将 ResultSet.getString 值与文本字段中的输入进行比较