1. 取user_id聚合后最大的id

image.png

  1. SELECT
  2. id, user_id, data
  3. FROM
  4. tbl a
  5. WHERE
  6. ( SELECT count(*) FROM tbl b WHERE a.user_id = b.user_id AND a.id <= b.id ) <= 1;

2. 此sql理解办法

理解这个SQL可以分为以下步骤:

  1. 用 LEFT JOIN 的方式查询
  2. 字段count展示查询聚合后每个id有几行数据
  3. 把字段count过滤条件放到where条件,生成最后的sql
  1. 用 LEFT JOIN 的方式查询

    1. SELECT
    2. a.id,
    3. a.user_id,
    4. a.`data`,
    5. b.id,
    6. b.user_id,
    7. b.`data`
    8. FROM
    9. hwp_test a
    10. LEFT JOIN hwp_test b ON a.user_id = b.user_id

    可以看到当通过ON来联合时,是以笛卡尔积的方式来组织数据的:
    image.png
    image.png

  2. 字段count展示查询聚合后每个id有几行数据

    1. SELECT
    2. id,
    3. user_id,
    4. `data`,
    5. ( SELECT count(*) FROM hwp_test b WHERE a.user_id = b.user_id) count
    6. FROM
    7. hwp_test a;

    与上一步骤对比可以看出,user_id = 1的数据id为1和2的数据,通过笛卡尔积计算之后,各有2条数据,对应count字段的值。
    同理user_id = 2的数据count = 1。
    image.png

  3. 把字段count过滤条件放到where条件,生成最后的sql