MySQL join连表查询示例
2018-09-28 本文已影响23人
f68c8a455b56
先给出一些数据库表,方便大家直观感受。
当前需求:在后台展示 某俱乐部在某时间段的玩家个人信息以及消耗信息。
ClubInfo : 俱乐部
ClubID | ClubName |
---|---|
30005 | 小帅哥俱乐部 |
30100 | GTT |
ClubUserInfo : 俱乐部-玩家,玩家可加入多个俱乐部。
ClubID | UserID | Level |
---|---|---|
30005 | 1003 | 13 |
30005 | 1004 | 0 |
30005 | 1005 | 2 |
30100 | 1003 | 5 |
30100 | 1010 | 8 |
CostInfo : 玩家消耗,每次消耗单独记录。
ClubID | UserID | CostMoney | Time |
---|---|---|---|
30005 | 1003 | 20 | 2018-09-26 11:15:45 |
30005 | 1004 | 1 | 2018-03-07 11:00:00 |
30005 | 1003 | 101 | 2018-09-11 10:00:00 |
30005 | 1005 | 45 | 2018-09-05 10:02:20 |
30100 | 1003 | 23 | 2017-02-05 12:04:20 |
30100 | 1003 | 3 | 2018-09-05 11:14:10 |
30100 | 1010 | 70 | 2017-11-05 19:14:10 |
AccountsInfo : 玩家个人信息,全局统一
UserID | NickName | FaceUrl | Age | Sex |
---|---|---|---|---|
1003 | 火烧风 | t.cn/4afs45 | 28 | 1 |
1004 | 暖暖 | t.cn/s655w5 | 23 | 0 |
1005 | 飞 | t.cn/56sgz | 19 | 1 |
1010 | 蓝天白云 | t.cn/y633 | 35 | 1 |
假如要查询俱乐部 30005 在 2018-09-01 到 2018-09-30 的信息,现在连表查询语句如下:
select A.*, B.CostMoney, C.NickName from ClubInfo as A
left join (
select UserID, sum(CostMoney) as Cost from CostInfo
where datediff( Time, '2018-09-01') >= 0 and datediff( Time, '2018-09-01') < 30
group by UserID
) as B on ( A.UserID = B.UserID)
join (
select UserID, NickName from AccountsInfo
) as C on ( A.UserID = C.UserID)
where A.ClubID = 30005 ;
结果如下:
ClubID | UserID | Level | CostMoney | NickName |
---|---|---|---|---|
30005 | 1003 | 13 | 121 | 火烧风 |
30005 | 1004 | 0 | 暖暖 | |
30005 | 1005 | 2 | 45 | 飞 |
可以看到 left join 允许右侧表空缺数据