【发布时间】:2009-07-23 21:23:40
【问题描述】:
我在想办法在 MySQL 中执行以下联接时遇到了麻烦。我不确定哪个联接最适合这项任务,所以当有人指出时我会编辑标题。这是我正在尝试做的事情的要点。
我有两张桌子,一张叫Students,另一张叫Marks。
它们的设置如下,
学生
只有 ID 字段是唯一的
.----+-----------------+--------+--------。 |身份证 |姓名 |家长 |马克 | +----+-----------------+--------+--------+ | 1 |名字在这里1 | 0 | 0 | | 2 |名字在这里2 | 0 | 20 | | 3 |名字在这里3 | 2 | 45 | | 4 |名字在这里4 | 2 | 50 | | 5 |名字在这里3 | 1 | 20 | | 6 |名字在这里1 | 0 | 65 | .----+-----------------+--------+--------。标记
Id 和 Name 是唯一的
.----+-----------------+--------。 |身份证 |姓名 |排名 | +----+------------------+--------+ | 1 |名字在这里1 | 20 | | 2 |名字在这里2 | 60 | | 3 |名字在这里3 | 90 | | 4 |名字在这里4 | 200 | | 5 |名字在这里5 | 45 | | 6 |名字在这里6 | 76 | .----+-----------------+--------。现在,我需要如下。
1.我需要自己加入学生,以便Students.Parent=Students.Id
2.在上面的联接中,我只想选择Students.Mark (S2) 在该父项下最高的行。此外,仅当 Students.Mark >= 20(也为 S2)时才加入。
3.我想在Marks.Name(来自S1)上加入之前的Student.Name,选择排名。
结果
.----+-----------------+--------+--------+-------- +----------。 |身份证 |姓名 |家长 |儿童 |马克 |排名 | +----+-----------------+--------+--------+-------- +----------+ | 1 |名字在这里1 | 0 | 5 | 20 | 20 | | 2 |名字在这里2 | 0 | 4 | 50 | 60 | .----+-----------------+--------+--------+-------- +----------。我认为(?)这可以使用一个查询,但不确定。
【问题讨论】:
-
我看过这个,但它太令人困惑了 - 为什么你的名字也在标记表中?为什么学生表中有标记?它看起来真的很糟糕,但这可能只是你混淆了我猜的原始名称的结果。但它太抽象了,无法帮助您,抱歉。
-
是的,规范化似乎有点偏离,但公平地说,实际的表远更复杂。这是一个任何形式的复杂问题,如果不从答案中删除所有有效性,我就无法进一步减少它。