我无法想办法在MySQL中进行以下连接。我不确定哪个联接最适合这个任务,所以当有人指出它时我会编辑标题。这是我要做的事情的要点。
我有两个表,一个叫Students
,另一个Marks
它们的设置如下,
只有Id字段是唯一的
.----+-----------------+--------+--------. | Id | Name | Parent | Mark | +----+-----------------+--------+--------+ | 1 | Name goes here1 | 0 | 0 | | 2 | Name goes here2 | 0 | 20 | | 3 | Name goes here3 | 2 | 45 | | 4 | Name goes here4 | 2 | 50 | | 5 | Name goes here3 | 1 | 20 | | 6 | Name goes here1 | 0 | 65 | .----+-----------------+--------+--------.
ID和名称是唯一的
.----+-----------------+--------. | Id | Name |Ranking | +----+-----------------+--------+ | 1 | Name goes here1 | 20 | | 2 | Name goes here2 | 60 | | 3 | Name goes here3 | 90 | | 4 | Name goes here4 | 200 | | 5 | Name goes here5 | 45 | | 6 | Name goes here6 | 76 | .----+-----------------+--------.
现在,我需要的是如下
1.我需要自己加入学生,以便Students
。Parent
= Students
。Id
2.在上面的连接中,我只想选择Students
所在的行。Mark
(S2)在该父项下最高。此外,仅在Students
。Mark
> = 20(也是S2)时加入
3.我想加入之前的Student
。Name
Marks
。Name
(来自S1),选择排名。
.----+-----------------+--------+--------+--------+----------. | Id | Name | Parent | Child | Mark | Ranking | +----+-----------------+--------+--------+--------+----------+ | 1 | Name goes here1 | 0 | 5 | 20 | 20 | | 2 | Name goes here2 | 0 | 4 | 50 | 60 | .----+-----------------+--------+--------+--------+----------.
我认为(?)这可以使用一个查询,但我不确定。
答案 0 :(得分:3)
此查询应该可以满足您的需求。
SELECT
s1.Id, s1.Name, s1.Parent, s2.Id as Child, MAX(s2.Mark) as Mark, m.Ranking
FROM
Students s1
INNER JOIN Students s2 ON (s1.id = s2.parent AND s2.Mark >= 20)
LEFT JOIN Marks m ON (s1.name = m.name)
GROUP BY
s1.Id, s1.Name, s1.Parent, Child, Ranking;
答案 1 :(得分:0)
1
select * from Students S1
join Students S2 on(S1.Id=S2.StudentId)
2
您需要澄清两个案例中每个案例中您所指的两个学生实例中的哪一个 - S1或S2?当你表达你的(家庭作业?)作业时,在每种情况下都是100%含糊不清。可能是where S1.Mark>=20 and S1.Mark=(select max(s3.mark) from students s3
等等,或许多其他变体。
再次模糊了你的学生实例,无论如何你只需要改变选择并添加一个连接:
选择Marks.Ranking from 学生S1 加入学生S2(S1.Id = S2.StudentId) 加入标记(S1.Name = Marks.Name)
和where
子句一样。