mysql left join的时候又表是多条记录的话,会出现冗余的情况
mysql left join 右表多条记录
MySQL中的LEFT JOIN语句用于从左表(table1)中返回所有记录,即使右表(table2)中没有匹配的记录。如果右表有多条匹配左表中一条记录的记录,结果中将会有多个行反映这一点。
例如,有两个表:
-
employees
(左表)
employee_id | employee_name |
---|---|
1 | John Doe |
2 | Jane Smith |
-
salaries
(右表)
employee_id | salary | year |
---|---|---|
1 | 50000 | 2019 |
1 | 52000 | 2020 |
2 | 60000 | 2019 |
如果你想要获取所有员工及其薪资信息,即使某些员工没有薪资信息,你可以使用LEFT JOIN:
SELECT e.employee_id, e.employee_name, s.salary, s.year
FROM employees e
LEFT JOIN salaries s ON e.employee_id = s.employee_id;
这将返回:
employee_id | employee_name | salary | year |
---|---|---|---|
1 | John Doe | 50000 | 2019 |
1 | John Doe | 52000 | 2020 |
2 | Jane Smith | 60000 | 2019 |
如果你注意到,由于John Doe有两个薪资条目,在结果集中他会显示两次,与右表中的每条记录匹配。这是LEFT JOIN的特性之一,它保证了左表(employees)中的所有记录都会出现在结果集中,即使右表(salaries)中没有匹配的记录。
如果为了保证leftjoin的记录的唯一性,右边可以采用distint获取一下唯一性:
SELECT e.employee_id, e.employee_name, s.salary, s.year
FROM employees e
LEFT JOIN (SELECT DISTINCT ON (employee_id) * FROM salaries) as s ON e.employee_id = s.employee_id;