使用MySQL连接三个表

使用MySQL连接三个表,mysql,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

我有三张名为

**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
现在显示学生姓名和他学习过的课程名称

**Result**
---------------------------
Student        Course
---------------------------
ahmed         physic
ahmed         maths
ahmed         computer
ahmed         chemistry
ali           physic
ali           maths
john          computer
john          chemistry
king          physic
king          maths
我构建以下查询

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
但它不会返回所需的结果

如果我想找出谁是管理者,而不是其他人,那么规范化表单应该是什么呢

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

**manage**
--------------
mid      eid
--------------
1         2
1         3
3         4
4         5
想要得到这个结果:

**result**
--------------------
Manager      Staff
--------------------
ali          king
ali          mak
mak          sam
sam          jon

使用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 
只需使用:

select s.name "Student", c.name "Course"
from student s, bridge b, course c
where b.sid = s.sid and b.cid = c.cid 
用于规范化表单

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
使用以下命令:

SELECT s.name AS Student, c.name AS Course 
FROM student s 
  LEFT JOIN (bridge b CROSS JOIN course c) 
    ON (s.id = b.sid AND b.cid = c.id);

您可以像上面的示例那样连接多个表。

查询以连接两个以上的表:

SELECT ops.field_id, ops.option_id, ops.label
FROM engine4_user_fields_maps AS map 
JOIN engine4_user_fields_meta AS meta ON map.`child_id` = meta.field_id
JOIN engine4_user_fields_options AS ops ON map.child_id = ops.field_id 
WHERE map.option_id =39 AND meta.type LIKE 'outcomeresult' LIMIT 0 , 30

不要那样加入。这是一个非常糟糕的练习!!!它会降低获取海量数据的性能。例如,如果每个表中有100行,数据库服务器必须获取
100x100x100=1000000次。它必须以
100万次的价格出售。为了克服这个问题,将前两个表连接起来,以获取尽可能少的匹配结果(这取决于您的数据库模式)。在子查询中使用该结果,然后将其与第三个表联接并获取它。对于第一次连接-->
100x100=10000
次,假设我们得到5个匹配结果。然后我们加入第三个表,结果是-->
5x100=500。
Total fetch=
10000+500=10200次。于是,表演提高了

只是在前面的答案中添加了一点,在MySQL中我们可以使用

table_factor syntax 

表\u系数示例

SELECT prd.name, b.name 
FROM products prd, buyers b
SELECT prd.name, b.name 
FROM products prd
 left join buyers b on b.bid = prd.bid;
联接表示例

SELECT prd.name, b.name 
FROM products prd, buyers b
SELECT prd.name, b.name 
FROM products prd
 left join buyers b on b.bid = prd.bid;

仅供参考:请忽略以下事实:连接表示例中的左连接没有多大意义(实际上,我们将使用某种连接表将买家链接到产品表,而不是将buyerID保存在产品表中)。

@Muhammad:我们的答案是相同的,只是语法不同而已。如果您不了解ANSI的
syntax,那么花时间学习它是值得的。这将有助于您避免“代码>连接< /代码>错误,就像您在将来所做的那样。请看简单明了,但是FWW考虑下面的博客这个语法:如不,不,不,不,不!不要再使用这个遗留的,古老的,超过25岁的连接语法了!像这个答案中那样使用显式连接并没有给这个问题添加任何新的内容,并且使用了奇怪的语法(如果不是完全错误的语法,我会很惊讶这在MySQL中是否有效)。我不同意AeroX。Ansi连接语法旨在消除老式逗号/where连接语法的歧义。我想看看MySql是否特别支持ansi join语法。在第一个结果中,您错误地为ahmed和aliWe设置了数据。我们有4个表:名称、地址、电子邮件、电话选择A.personID、B.address、C.emailID、,D.mobnumber FROM name AS A.personID=B.personID internal JOIN email AS C ON A.personID=C.personID internal JOIN phone AS D ON A.personID=D.personID假设personID存在于所有表中。此查询将显示人员ID、地址、电子邮件和电话号码,其中人员ID在所有表中都是相同的,因为它是一个内部联接。希望这有帮助:)在
m.mid=e1.id
m.eid=e2.id
中,顺序重要吗?@Pathros不,在这些表达式中,顺序不重要。这个答案看起来与5年前给出的答案非常相似。你认为你的答案很重要,但在现有答案中缺失了什么?几年前已经有多个答案显示“连接多个表”。你的回答给讨论增添了什么?多年前已有多个答案表明“加入多个表格”。你的回答给讨论增添了什么内容?
SELECT prd.name, b.name 
FROM products prd
 left join buyers b on b.bid = prd.bid;
Query for three table join and limit set

SELECT * FROM (SELECT t1.follower_userid, t2.*, t3.login_thumb, t3.login_name, 
  t3.bio, t3.account_status, t3.gender
     FROM videos t2
      LEFT JOIN follower t1
        ON t1.follower_userid = t2.user_id 
         LEFT JOIN videos_user t3 
          ON t1.follower_userid  = t3.login_userid
           WHERE t1.following_userid='$userid'
            LIMIT $startpoint , $limit) AS ID 
             ORDER BY ID DESC