Mysql 此查询的内部联接方法是否正确?

Mysql 此查询的内部联接方法是否正确?,mysql,inner-join,Mysql,Inner Join,我想在SQL查询方面得到一些帮助,我正在努力解决这个问题,我已经完成了90%的工作,这只是我遇到的最后一点小问题 数据库设计 我有以下数据库模式 CREATE TABLE IF NOT EXISTS EMPLOYEES( ID INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY, FIRST_NAME VARCHAR(255) NOT NULL, LAST_NAME VARCHAR(255) NOT NULL, SEX CHA

我想在SQL查询方面得到一些帮助,我正在努力解决这个问题,我已经完成了90%的工作,这只是我遇到的最后一点小问题

数据库设计 我有以下数据库模式

CREATE TABLE  IF NOT EXISTS EMPLOYEES(
    ID INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,
    FIRST_NAME VARCHAR(255) NOT NULL,
    LAST_NAME VARCHAR(255) NOT NULL,
    SEX CHAR(1) NOT NULL,
    COST INTEGER NOT NULL
);

CREATE TABLE IF NOT EXISTS SKILLS(
    ID INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,
    SKILL VARCHAR(300) NOT NULL
);

CREATE TABLE IF NOT EXISTS EMPLOYEE_SKILLS(
    EMPLOYEE_ID INTEGER NOT NULL,
    SKILL_ID INTEGER NOT NULL,
    PROFICIENCY SET('1','2','3','4') NOT NULL,

    PRIMARY KEY(EMPLOYEE_ID,SKILL_ID),
    UNIQUE INDEX(SKILL_ID,EMPLOYEE_ID),
    FOREIGN KEY (EMPLOYEE_ID) REFERENCES EMPLOYEES(ID) ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY (SKILL_ID) REFERENCES SKILLS(ID) ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS PROJECTS(
    ID INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,
    NAME VARCHAR(300) NOT NULL,
    LOCATION VARCHAR(255) DEFAULT NULL,
    INCOME INTEGER NOT NULL
);

CREATE TABLE IF NOT EXISTS TASKS(
    ID INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,
    NAME VARCHAR(300) NOT NULL,
    PROJECT_ID INTEGER NOT NULL,
    DATE_FROM DATE NOT NULL,
    DATE_TO DATE NOT NULL,
    COMPLETED BOOLEAN DEFAULT 0,

    FOREIGN KEY (PROJECT_ID) REFERENCES PROJECTS(ID) ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS TASK_SKILLS(
    TASK_ID INTEGER NOT NULL,
    SKILL_ID INTEGER NOT NULL,
    PROFICIENCY_REQUIRED SET('1','2','3','4') NOT NULL,

    PRIMARY KEY(TASK_ID,SKILL_ID),
    UNIQUE INDEX(SKILL_ID,TASK_ID),

    FOREIGN KEY (TASK_ID) REFERENCES TASKS(ID) ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY (SKILL_ID) REFERENCES SKILLS(ID) ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS ASSIGNED_TO(
    EMPLOYEE_ID INTEGER NOT NULL,
    TASK_ID INTEGER NOT NULL,
    DATE_ASSIGNED DATETIME NOT NULL,

    PRIMARY KEY(EMPLOYEE_ID,TASK_ID),
    UNIQUE INDEX(TASK_ID,EMPLOYEE_ID),

    FOREIGN KEY (EMPLOYEE_ID) REFERENCES EMPLOYEES(ID) ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY (TASK_ID) REFERENCES TASKS(ID) ON UPDATE CASCADE ON DELETE CASCADE
);
查询 因此,我想创建的查询是返回数据库中的每个员工及其技能和熟练程度。这是查询中我没有遇到问题的部分,我有以下查询:

选择EMPLOYEES.ID、CONCAT\u WS“”、EMPLOYEES.FIRST\u NAME、EMPLOYEES.LAST\u NAME作为名称、组\u CONCAT SKILLS.SKILL、EMPLOYEES.COST、组\u CONCAT EMPLOYEES\u skillence 从员工技能 使用EMPLOYEE_SKILLS.EMPLOYEE_ID=EMPLOYEES.ID加入员工 加入员工技能上的技能\u SKILLS.SKILL\u ID=SKILLS.ID 按雇员分组。ID

上面的查询提供了我想要的大部分内容,它返回数据库中的每个员工及其相关技能和他们所知道的级别

我现在正在努力解决的问题是,我还想加入这个查询,同时查看数据库的ASSIGNED_to表,在那里我想找到组织内分配给任务或不分配给任务的所有员工,并返回他们已分配的任务ID以及所述任务的开始和结束日期

我试着简单地在上面的查询中将另一个连接添加到分配的表中,但它没有给我想要的输出。我怀疑是因为我是按员工id进行分组的。我是否需要使用类似于两个查询的方法来获取我想要的内容,例如和内部选择和外部选择,并在它们之间进行内部联接?我不确定这个查询的方法是什么

很抱歉发了这么长的帖子,任何帮助都将不胜感激


谢谢。

员工是否总是被分配至少一项任务?然后内部加入就可以了,否则你会希望外部员工->分配给你的加入,然后是内部员工->分配给你的任务。。。此外,如果您只希望每个员工有一行,您可能希望查看GROUP_CONCAT,以便将所有分配的任务合并到ResultHanks中的单个文本列表列中,以获取注释。这有点道理。在我的情况下,一名员工可以被分配到多个任务,所以我想我必须采取你提到的第二种选择。我不太清楚内部联接和外部联接是如何工作的,需要什么样的语法才能有两个独立的语句,并用内部联接或外部联接将它们联接起来。ThanksInner将第一个表的每一行连接到第二个表的每一行。只是说连接或明确地说内部连接是相同的。左联接或左外部联接将把第一个表中的每一行联接到第二个表中的每一个匹配行,但是如果没有匹配的第二个表行,您仍然会得到第一个表行,同时假装有一个匹配的第二个表行,其中所有字段都有空值。右外部联接则相反:第二个表中的所有行,如果没有匹配的第一个表行,则添加空值。非常感谢,我刚刚尝试了它,它成功了!永远感激!