MySQL三表左连接去除重复列
在处理多个数据表关联查询的过程中,经常会使用到左连接(LEFT JOIN)操作。在多个表关联查询中,往往会出现数据重复的情况。那么,如何使用MySQL进行去重呢?
阅读更多:MySQL 教程
左连接(LEFT JOIN)
左连接(LEFT JOIN)是指将左表(A表)的所有记录都要查出来,右表(B表)中有相同的记录则关联上,没有则为空值NULL。在这个过程中,如果B表中存在与A表中某些记录重复的数据,多个重复的数据会一并展示。下面我们通过示例来进行说明。
有三张表如下:
students表
student_id | name | phone |
---|---|---|
1 | Jessie | 136xxxx |
2 | Lucy | 137xxxx |
courses表
course_id | name | score |
---|---|---|
1 | Math | 90 |
2 | English | 85 |
3 | Science | 88 |
scores表
student_id | course_id | score |
---|---|---|
1 | 1 | 89 |
1 | 2 | 82 |
2 | 1 | 92 |
2 | 3 | 86 |
我们需要查询出每个学生的姓名和分数。同时,如果课程表中存在没有学生选的课程,也要把这些课程作为左连接查询的结果。
下面是SQL查询语句:
SELECT s.name, c.name, sc.score
FROM students s
LEFT JOIN scores sc ON s.student_id = sc.student_id
LEFT JOIN courses c ON sc.course_id = c.course_id
查询结果如下:
name | name | score |
---|---|---|
Jessie | Math | 89 |
Jessie | English | 82 |
Lucy | Math | 92 |
Lucy | Science | 86 |
我们可以看到,左连接查询的结果中存在重复的学生姓名。那么如何去重呢?
不去重的LEFT JOIN
在LEFT JOIN查询语句中,如果我们不进行去重操作,则查询结果会出现重复行。如上面的示例查询结果中的Jessie和Lucy学生姓名就重复了。
如果实际需求不需要去重,则不需要进行额外的操作。这种情况下返回的结果即为我们所需要的。
使用DISTINCT去重
DISTINCT是MySQL中一种去除重复记录的方法。其用法很简单,在SQL查询语句中添加DISTINCT关键字即可。我们可以将上述查询结果中的重复记录去除掉。
例如,我们可以这样做:
SELECT DISTINCT s.name, c.name, sc.score
FROM students s
LEFT JOIN scores sc ON s.student_id = sc.student_id
LEFT JOIN courses c ON sc.course_id = c.course_id
查询结果如下:
name | name | score |
---|---|---|
Jessie | Math | 89 |
Jessie | English | 82 |
Lucy | Math | 92 |
Lucy | Science | 86 |
可以看到,使用DISTINCT关键字进行去重后,查询结果的重复行得以去除。但是,需要注意的是,使用DISTINCT关键字会对查询的性能产生一定的影响。
去重的LEFT JOIN
实际上,我们可以使用更为优化的方法进行查询结果的去重。使用GROUP BY关键字自然就是一种思路。
我们可以对查询语句中的重复项进行group by操作,这样就可以保证最终查询结果中不存在重复的记录。
例如,我们可以这样做:
SELECT s.name, c.name, MAX(sc.score) as score
FROM students s
LEFT JOIN scores sc ON s.student_id = sc.student_id
LEFT JOIN courses c ON sc.course_id = c.course_id
GROUP BY s.name查询结果如下:
|name |name |score|
|------|--------|------|
|Jessie |Math |89 |
|Jessie |English |82 |
|Lucy |Math |92 |
|Lucy |Science |86 |
可以看到,使用了GROUP BY关键字后,查询结果中的重复记录得以去除。
在上述查询语句中,我们对学生的姓名进行了group by,同时对分数进行了聚合操作(使用MAX函数)。使用MAX函数是为了保证在匹配到重复数据时,去除分数最小的一条记录。
总结
在进行MySQL多表LEFT JOIN操作的过程中,很容易遇到数据重复的情况。针对此类情况,我们可以使用DISTINCT或GROUP BY等关键字进行去重操作。
总的来说,使用DISTINCT关键字简单而直接,但查询性能相对较差;而使用GROUP BY关键字则比较麻烦,但可以更好的保证查询性能,在实际开发中需要根据具体需求选择合适的方法来进行去重操作。