1. 取user_id聚合后最大的id

SELECTid, user_id, dataFROMtbl aWHERE( SELECT count(*) FROM tbl b WHERE a.user_id = b.user_id AND a.id <= b.id ) <= 1;
2. 此sql理解办法
理解这个SQL可以分为以下步骤:
- 用 LEFT JOIN 的方式查询
- 字段count展示查询聚合后每个id有几行数据
- 把字段count过滤条件放到where条件,生成最后的sql
用 LEFT JOIN 的方式查询
SELECTa.id,a.user_id,a.`data`,b.id,b.user_id,b.`data`FROMhwp_test aLEFT JOIN hwp_test b ON a.user_id = b.user_id
可以看到当通过ON来联合时,是以笛卡尔积的方式来组织数据的:


字段count展示查询聚合后每个id有几行数据
SELECTid,user_id,`data`,( SELECT count(*) FROM hwp_test b WHERE a.user_id = b.user_id) countFROMhwp_test a;
与上一步骤对比可以看出,user_id = 1的数据id为1和2的数据,通过笛卡尔积计算之后,各有2条数据,对应count字段的值。
同理user_id = 2的数据count = 1。
把字段count过滤条件放到where条件,生成最后的sql
