在做项目的时候需要实现一个多表左联加分组查询的逻辑。
下图是前端要显示的数据:
数据来源于三张表:
- ETC表:cap_etc
- 车辆表:cap_vehicle
- ETC消费表:cap_etc_record
下图是后台的三张数据表:
cap_etc:
cap_vehicle:
cap_etc_record:
涉及的问题:
- 如何将三张表的数据联系起来
- 前台显示的最近消费时间如何获取
- 端显示数据的主体是ETC数据表里的数据,其中车型、最近消费时间、余额这三个字段即使没有查到,也要显示主体的ETC表数据,所以对于三张表数据的联查,要使用左联查询,将ETC表作为主表,左联车辆表和消费记录表
ETC连接车辆表的字段为:车牌号 vehicle_num
ETC连接消费表的字段为:绑定消费表字段 etc_id
所以到目前为止,可以将三张表进行左联查询,其中sql语句为:
SELECTce.id,ce.etc_account,ce.etc_status,ce.vehicle_num,cer.card_balance,use_time
FROMcap_etc ce
LEFT JOIN cap_vehicle cv ON ce.vehicle_num = cv.vehicle_num
LEFT JOIN cap_etc_record cer ON cer.id = ce.id
目前为止,已经使用左联查询将三张表连接起来了,不过对于第二个问题还没有解决,一张etc卡会有多条消费记录,其中前端要显示最近的一条消费记录,那么现在的问题就是:
- 要找到每一张etc卡对应的最近消费时间
这时候我们就要通过ETC的id来分组,查询对应一组消费记录中的最近消费时间:
如何查询一组数据中的最近消费时间呢?
我们可以用用order by来获取最近的一条消费记录,注意要加一个limit限定,只查询出一条记录
SELECT id FROM cap_etc_record r ORDER BY r.use_time DESC LIMIT 1
最近消费时间也查出来了,现在只剩下ETC卡id分组了,分组的话可直接使用group by
但是在这个业务逻辑中,我们使用可直接通过查条件来实现分组,以下是完整的查询sql语句:
SELECTce.id,ce.etc_account,ce.etc_status,ce.vehicle_num,cer.card_balance,use_time
FROMcap_etc ceINNER JOIN cap_vehicle cv ON ce.vehicle_num = cv.vehicle_numLEFT JOIN cap_etc_record cer ON cer.id = ( SELECT id FROM cap_etc_record r WHERE r.etc_id = ce.id ORDER BY r.use_time DESC LIMIT 1 )
至此,这个问题就解决了。