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关系,可以创建另一个表。