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

时间:2014-12-07 13:16:23

标签: 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 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
);

查询

因此,我想要创建的查询是返回数据库中的每个EMPLOYEE以及他们的SKILLSPROFICIENCY技能。这是查询的一部分,我没有遇到任何问题,我有以下查询:

SELECT EMPLOYEES.ID, CONCAT_WS(' ',EMPLOYEES.FIRST_NAME,EMPLOYEES.LAST_NAME) AS NAME, GROUP_CONCAT(SKILLS.SKILL),EMPLOYEES.COST,GROUP_CONCAT(EMPLOYEE_SKILLS.PROFICIENCY) FROM EMPLOYEE_SKILLS JOIN EMPLOYEES ON EMPLOYEE_SKILLS.EMPLOYEE_ID = EMPLOYEES.ID JOIN SKILLS ON EMPLOYEE_SKILLS.SKILL_ID = SKILLS.ID GROUP BY EMPLOYEES.ID

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

我现在正在努力的事情是,我也想加入这个查询,同时也查看数据库的ASSIGNED_TO表,在那里我想找到所有员工。组织(分配给任务与否)并返回已分配的TASK ID以及所述任务的开始和结束日期。

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

很抱歉这篇长篇文章很感激任何帮助。

感谢。

0 个答案:

没有答案