MySQL:如何进行包含连接和左连接的查询

MySQL:如何进行包含连接和左连接的查询,mysql,join,left-join,outer-join,Mysql,Join,Left Join,Outer Join,这只是一个大学练习,所以我不着急。但我想知道答案。考虑这些表和行: create table course ( numco integer, nameco varchar(20) not null, primary key (numco) ); create table prereq ( numco integer, numcoprereq integer, primary key (numco, numcoprereq), fore

这只是一个大学练习,所以我不着急。但我想知道答案。考虑这些表和行:

create table course (
    numco   integer,
    nameco  varchar(20) not null,
    primary key (numco)
);
create table prereq (
    numco integer,
    numcoprereq integer,
    primary key (numco, numcoprereq),
    foreign key (numco) references course (numco),
    foreign key (numcoprereq) references course (numco)
);
insert into course values (1, 'course 1');
insert into course values (2, 'course 2');
insert into course values (3, 'course 3');
insert into course values (4, 'course 4');
insert into course values (1, 'course 5');
insert into course values (2, 'course 6');
insert into prereq values (4, 2);
insert into prereq values (2, 1);
这不是我做的。我只是翻译了一下,删除了一些不相关的部分。我知道有两个
课程
行具有相同的主键,但我必须就这一行询问我的老师

他要求我们写一个查询,以获得课程名称和先修课程名称。如果它只是课程的编号,那么左键就可以了。但我不能让名字起作用。它应该输出:

course 1    (null)
course 2    course 1
course 3    (null)
course 4    course 2
course 5    (null)
course 6    course 1
我搜索了很多,写了两次尝试:

select C1.nameco, C2.nameco as namecoprereq
    from course C2 left join
    (course C1 join prereq P on C1.numco = P.numco)
    on C2.numco = P.numcoprereq;

select C1.nameco, C2.nameco as namecoprereq
    from (course C1 join prereq P on C1.numco = P.numco)
    left join course C2 on C2.numco = P.numcoprereq;
它们分别输出:

course 2    course 1
course 6    course 1
course 4    course 2
(null)      course 3
(null)      course 4
course 2    course 5
course 6    course 5
course 4    course 6


我知道(我想,我还没有试过)我可以用并号和减号来做,但我想知道是否可以用单选来做。你知道如何在不费力的情况下做到这一点吗?

你的问题几乎得到了正确的答案,但我认为你的搜索有点太远了。用“英语”想想吧:

  • 我有课程(
    来自课程
  • 其中一些具有先决条件(
    LEFT-JOIN-prereq
  • 我需要先修课程的名称(
    左入课程
  • 这应该起作用:

    SELECT
        c1.nameco,
        c2.nameco AS nameprereq
    FROM course AS c1
    LEFT JOIN prereq AS p ON p.numcoprereq = c1.numco
    LEFT JOIN course AS c2 ON c2.numco = p.numco
    

    谢谢你的回答,但你倒过来了。在
    On
    子句上,切换
    p.
    属性。这就是我想要的答案。我从来没有想过使用两个左连接。我想更详细地了解这些查询是如何执行的,以了解我的尝试失败的原因。再次感谢你的回答。
    SELECT
        c1.nameco,
        c2.nameco AS nameprereq
    FROM course AS c1
    LEFT JOIN prereq AS p ON p.numcoprereq = c1.numco
    LEFT JOIN course AS c2 ON c2.numco = p.numco