1. 取user_id聚合后最大的id
SELECT
id, user_id, data
FROM
tbl a
WHERE
( 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 的方式查询
SELECT
a.id,
a.user_id,
a.`data`,
b.id,
b.user_id,
b.`data`
FROM
hwp_test a
LEFT JOIN hwp_test b ON a.user_id = b.user_id
可以看到当通过ON来联合时,是以笛卡尔积的方式来组织数据的:
字段count展示查询聚合后每个id有几行数据
SELECT
id,
user_id,
`data`,
( SELECT count(*) FROM hwp_test b WHERE a.user_id = b.user_id) count
FROM
hwp_test a;
与上一步骤对比可以看出,user_id = 1的数据id为1和2的数据,通过笛卡尔积计算之后,各有2条数据,对应count字段的值。
同理user_id = 2的数据count = 1。把字段count过滤条件放到where条件,生成最后的sql