MySQL 加入条件
Posted
技术标签:
【中文标题】MySQL 加入条件【英文标题】:MySQL Join Condition 【发布时间】: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 | .----+-----------------+--------+--------+-------- +----------。我认为(?)这可以使用一个查询,但不确定。
【问题讨论】:
我看过这个,但它太令人困惑了 - 为什么你的名字也在标记表中?为什么学生表中有标记?它看起来真的很糟糕,但这可能只是你混淆了我猜的原始名称的结果。但它太抽象了,无法帮助您,抱歉。 是的,规范化似乎有点偏离,但公平地说,实际的表远更复杂。这是一个任何形式的复杂问题,如果不从答案中删除所有有效性,我就无法进一步减少它。 【参考方案1】:这个查询应该做你正在寻找的。p>
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;
【讨论】:
根本不是孩子/父母。我混淆了数据库以保持问题的概括性。这恰好是首先想到的,无论如何重要的不是关系,而是方法。感谢您的帮助。 啊,我没有意识到它被混淆了。我删除了其他问题。【参考方案2】: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 学生 S1 加入学生 S2 (S1.Id=S2.StudentId) 加入 Marks on(S1.Name=Marks.Name)
和以前一样的where
子句。
【讨论】:
澄清一下,这不是一个任务,我只是想让实际的数据库不明确。对于 2.,两者都来自 S2。然后对于 3.,加入 S1.Name。根据结果,我认为它有点(?)清楚,但我会编辑澄清。 永远不要进行交叉连接...(这是一个没有指定内/外/左/右的连接) @corymathews,“交叉连接”并不意味着“省略形容词”(标准 SQL 和 MySQL 也允许显式形容词 CROSS):它意味着 省略 ON 子句我>。 JOIN...ON 表示 INNER JOIN (请在 SQL 上对***页面投反对票:它给出了完全可以接受且正确的语法作为 JOIN 的第一个示例!-)。以上是关于MySQL 加入条件的主要内容,如果未能解决你的问题,请参考以下文章