mysql left join 右表数据不唯一的情况解决方法:
1.left join 基本用法:
left join 是以A表为基础,A表即左表,B表即右表。
左表(A)的记录会全部显示,而右表(B)只会显示符合条件表达式的记录,如果在右表(B)中没有符合条件的记录,则记录不足的地方为NULL。
2.left join 右表数据不唯一解决方法
但如果B表符合条件的记录数大于1条,就会出现1:n的情况,这样left join后的结果,记录数会多于A表的记录数。
例如:member与member_login_log表的结构如下,member记录会员信息,member_login_log记录会员每日的登入记录。member表的id与member_login_log表的uid是对应关系。
member 表
id | username |
1 | fdipzone |
2 | terry |
member_login_log 表
id | uid | logindate |
1 | 1 | 2015-01-01 |
2 | 2 | 2015-01-01 |
3 | 1 | 2015-01-02 |
4 | 2 | 2015-01-02 |
5 | 2 | 2015-01-03 |
查询member用户的资料及最后登入日期:
如果直接使用left join:
select a.id, a.username, b.logindate
from member as a
left join member_login_log as b on a.id = b.uid;
id usernamelogindate
1 fdipzone
2015-01-01
1 fdipzone
2015-01-02
2 terry
2015-01-01
2 terry
2015-01-02
2 terry
2015-01-03
但这并不是我们要的结果,因此这种情况需要保证B表的符合条件的记录是空或唯一,我们可以使用group by来实现。
select a.id, a.username, b.logindate
from member as a
left join (select uid, max(logindate) as logindate from member_login_log group by uid) as b
on a.id = b.uid;
id username
logindate
1 fdipzone
2015-01-02
2 terry
2015-01-03