我想要一些我正在努力解决的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
以及他们的SKILLS
和PROFICIENCY
技能。这是查询的一部分,我没有遇到任何问题,我有以下查询:
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分组。我是否需要使用两个查询来获取我想要的内容,例如内部选择和外部选择并在它们之间进行内部连接?不确定这个查询的方法是什么。
很抱歉这篇长篇文章很感激任何帮助。
感谢。