Mysql 显示重复结果的左连接查询问题
我有表Mysql 显示重复结果的左连接查询问题,mysql,sql,Mysql,Sql,我有表person和讲师开设的课程。我正在执行一个sql查询,但是我得到了所需结果的重复值。我正在从person表中获取所有当前正在教授课程的讲师角色=1。可以对查询或表格提出哪些建议 预期结果: +-----------+-----------------+-------------+------------+ | person_id | instructor_name | course_name | company_id | +-----------+-----------------+--
person
和讲师开设的课程
。我正在执行一个sql查询,但是我得到了所需结果的重复值。我正在从person
表中获取所有当前正在教授课程的讲师角色=1
。可以对查询或表格提出哪些建议
预期结果:
+-----------+-----------------+-------------+------------+
| person_id | instructor_name | course_name | company_id |
+-----------+-----------------+-------------+------------+
| 154 | James Newton | | |
| 154 | James Newton | | |
| 478 | Tina Turner | | |
| 258 | James Fuller | | |
| 717 | Michael Jordan | Shoe Biz | 7 |
| 717 | Michael Jordan | Basketball | 7 |
| 964 | Steve Johnson | | |
+-----------+-----------------+-------------+------------+
当前:
+-----------+-----------------+-------------+------------+
| person_id | instructor_name | course_name | company_id |
+-----------+-----------------+-------------+------------+
| 154 | James Newton | | |
| 154 | James Newton | | |
| 478 | Tina Turner | | |
| 258 | James Fuller | | |
| 717 | Michael Jordan | Shoe Biz | 7 |
| 717 | Michael Jordan | Basketball | 7 |
| 717 | Michael Jordan | Shoe Biz | 7 |
| 717 | Michael Jordan | Basketball | 7 |
| 964 | Steve Johnson | | |
+-----------+-----------------+-------------+------------+
为了得到你的要求:
SELECT * from person
left join (select * from courses_by_instructors group by company_id) as mytable on mytable.person_id = person.person_id
where instructor_role = 1
order by person.person_name
但是,您在初始查询中没有重复项,因为公司id
将不同查询正常,但问题出在您的模型中。
我认为person表应该这样创建:
CREATE TABLE person
(
company_id int,
person_id int,
person_name varchar(30),
instructor_role tinyint,
staff_role tinyint,
CONSTRAINT PK_PERSON_ID PRIMARY KEY NONCLUSTERED (person_id),
);
CREATE TABLE courses_by_instructors
(
company_id int,
person_id int,
course_id int,
course_name varchar(30),
CONSTRAINT FK_PERSON_ID FOREIGN KEY (person_id)
REFERENCES person(person_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
将个人ID作为主键。“课程由讲师”表的创建方式应如下所示:
CREATE TABLE person
(
company_id int,
person_id int,
person_name varchar(30),
instructor_role tinyint,
staff_role tinyint,
CONSTRAINT PK_PERSON_ID PRIMARY KEY NONCLUSTERED (person_id),
);
CREATE TABLE courses_by_instructors
(
company_id int,
person_id int,
course_id int,
course_name varchar(30),
CONSTRAINT FK_PERSON_ID FOREIGN KEY (person_id)
REFERENCES person(person_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
具有引用个人ID的外键
请注意,我使用的是SQL Server,因此您可能需要稍微调整语法。尝试以下操作:
SELECT p.person_id, p.person_name, p.instructor_role, IFNULL(lj.company_id, 0) as company_id, lj.person_id, lj.course_name
FROM person as p
LEFT JOIN courses_by_instructors as lj
ON (lj.person_id = p.person_id AND lj.company_id = 7 )
WHERE instructor_role = 1
GROUP BY p.person_id,lj.course_name
ORDER BY person_name
它会给你你所需要的
请参见中的输出,它可以通过SELECT语句中的DISTINCT实现
SELECT DISTINCT p.person_id, p.person_name, p.instructor_role, IFNULL(lj.company_id, 0) as company_id, lj.person_id, lj.course_name
FROM person as p
LEFT JOIN courses_by_instructors as lj
ON (lj.person_id = p.person_id AND lj.company_id = 7 )
WHERE instructor_role = 1
ORDER BY person_name
下面是代码,请将p.company\u id as notdupe
添加到您的选择列表中,您可以看到它们不是重复结果这正是我需要的<代码>按p.person\u id,lj.course\u name分组,我想这会有所不同……你能详细说明一下,它是如何解决结果集中出现重复记录的问题的吗?@DipenduPaul:我想问题在于如何定义表。如果您检查该链接,您会注意到person表中的记录具有相同的person ID、讲师角色和员工角色,这在我看来毫无意义……设计未规范化。。但是,公司id不应该是Person表的一部分,如果Person和company之间存在N:N关系,那么公司应该进入其他表,为了维护N:N关系,可以创建另一个表。