使用MySQL加入三个表

PHP*_*ari 101 mysql

我有三个名为的表

**Student Table**
-------------
id    name
-------------
1     ali
2     ahmed
3     john
4     king

**Course Table**
-------------
id    name
-------------
1     physic
2     maths
3     computer
4     chemistry

**Bridge**
-------------
sid    cid
-------------
1     1
1     2
1     3
1     4
2     1
2     2
3     3
3     4
4     1
4     2
Run Code Online (Sandbox Code Playgroud)

现在用他研究过的课程名称来显示学生姓名,

**Result**
---------------------------
Student        Course
---------------------------
ahmed         physic
ahmed         maths
ahmed         computer
ahmed         chemistry
ali           physic
ali           maths
john          computer
john          chemistry
king          physic
king          maths
Run Code Online (Sandbox Code Playgroud)

我构建以下查询

select s.name as Student, c.name as Course from student s, course c join bridge b on c.id = b.cid order by s.name
Run Code Online (Sandbox Code Playgroud)

但它没有返回所需的结果......

如果我想找到谁是其他经理,那么规范化形式会是什么:

**employee**
-------------------
id        name
-------------------
1         ali
2         king
3         mak
4         sam
5         jon

**manage**
--------------
mid      eid
--------------
1         2
1         3
3         4
4         5
Run Code Online (Sandbox Code Playgroud)

并希望得到这个结果:

**result**
--------------------
Manager      Staff
--------------------
ali          king
ali          mak
mak          sam
sam          jon
Run Code Online (Sandbox Code Playgroud)

Red*_*ter 187

使用ANSI语法,如何加入表格将更加清晰:

SELECT s.name as Student, c.name as Course 
FROM student s
    INNER JOIN bridge b ON s.id = b.sid
    INNER JOIN course c ON b.cid  = c.id 
ORDER BY s.name 
Run Code Online (Sandbox Code Playgroud)

  • @Muhammad:我们的答案是一样的,它们只在语法上有所不同.如果您不了解`ANSI`语法,那么值得花时间学习它.它将帮助您避免像将来一样的"JOIN"错误. (8认同)

rai*_*syn 138

只需使用:

select s.name "Student", c.name "Course"
from student s, bridge b, course c
where b.sid = s.sid and b.cid = c.cid 
Run Code Online (Sandbox Code Playgroud)

  • 很好很简单,但是FWIW考虑以下博客关于此语法:https://sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins,如 https:// 中提到的stackoverflow.com/a/13476050/199364 (3认同)
  • 请参见http://stackoverflow.com/questions/13476029/multiple-table-select-vs-join-performance (2认同)
  • 不,不,不,不,不!不要再使用这种遗留的、古老的、超过 25 年的连接语法了!使用显式连接,如[此答案!!](/sf/answers/259670841/) (2认同)

PHP*_*ari 16

用于规范化表格

select e1.name as 'Manager', e2.name as 'Staff'
from employee e1 
left join manage m on m.mid = e1.id
left join employee e2 on m.eid = e2.id
Run Code Online (Sandbox Code Playgroud)

  • @Pathros 不,在这些表达式中顺序并不重要。 (2认同)

小智 5

SELECT *
FROM user u
JOIN user_clockits uc ON u.user_id=uc.user_id
JOIN clockits cl ON cl.clockits_id=uc.clockits_id
WHERE user_id = 158
Run Code Online (Sandbox Code Playgroud)

  • 这个答案看起来与 5 年前已经给出的答案非常相似。您认为您的答案哪些是重要的,哪些是现有答案中缺失的? (2认同)