MySQL三表左连接去除重复列

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关键字则比较麻烦,但可以更好的保证查询性能,在实际开发中需要根据具体需求选择合适的方法来进行去重操作。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程