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 加入条件的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 加入条件

MySQL根据条件多次加入

如何使 CriteriaBuilder 加入自定义“开启”条件?

mysql 条件满足就抓一行,不满足就抓另一个

在多个连接中放置“开启”条件在哪里更好? (mysql)

mysql 带条件的sum/count 使用技巧