【问题标题】:MySql - Retrieving the last record in each subgroupMySql - 检索每个子组中的最后一条记录
【发布时间】:2025-12-10 05:40:01
【问题描述】:

1.采购表

Id   user     pur_type
----------------------
1    408       5-12
2    408       5-12
3    222       1-11
4    222       5-12
5    408       1-11
6    408       1-11

2。商品表

Id   parts    days
-----------------
1    1-11      50
2    5-12      40

我实现了这样的查询

SELECT p1.id, p1.user, p1.pur_type, g.parts, g.days
FROM purchase p1
INNER JOIN goods g ON p1.pur_type = g.parts
LEFT JOIN goods p2 ON ( p1.pur_type= p2.pur_type
AND p1.id < p2.id )
WHERE p2.id IS NULL

结果只是每个 pur_type 的最后一条记录

Id   user   pur_type  parts   days
---------------------------------
4    222     5-12     5-12    40
6    408     1-11     1-11    50

如何从每个pur_typepurchase 表中获取一个特定用户的最后一条记录?

例如对于用户 408 需要结果:

Id   user     parts   days
-------------------------
2    408       5-12    40
6    408       1-11    50

结果说明:
用户 408 的最后一条记录 fot part 5-12 是 id=2
用户 408 的 part 1-11 的最后一条记录是 id=6

【问题讨论】:

  • 当然LEFT JOIN goods p2 应该是LEFT JOIN purchase p2
  • goods表中的id列其实是多余的吗?

标签: mysql sql group-by greatest-n-per-group


【解决方案1】:
SELECT  a.*, c.* -- select columns youw ant
FROM    Purchase a
        INNER JOIN
        (
            SELECT user, MAX(ID) max_ID
            FROM    Purchase
            GROUP   BY user, pur_type
        ) b ON  a.user = b.user AND
                a.ID = b.max_ID
        INNER JOIN goods c
            ON a.pur_type = c.parts
WHERE   a.USER = 408

为了获得更好的性能,请在表 goods 以及 pur_type 上的列 parts 上添加一个索引

【讨论】:

    【解决方案2】:

    对现有查询的简单修改:

    SELECT p1.id, p1.user, p1.pur_type, g.parts, g.days
    FROM purchase p1
    INNER JOIN goods g ON p1.pur_type = g.parts
    LEFT JOIN purchase p2 
           ON ( p1.pur_type= p2.pur_type AND p1.id < p2.id AND p1.user=p2.user)
    WHERE p2.id IS NULL and p1.user = 408
    

    【讨论】:

    • 结果将是408的最后一条记录
    • @user2054164:此查询将返回购买表中指定用户的每个 pur_type 的最后一条记录 - 请参阅 sqlfiddle.com/#!2/9b487/11 。两个答案都是正确的,但这个更接近您的原始查询。
    • 感谢您的回答,获取用户 408 的最后一条记录的结果会很有用,但我的问题是,我需要获取一个特定用户的最后每个 pur_type 类型的结果
    • @user2054164:请重新阅读我刚才所说的内容 - 此查询返回购买表 FOR EACH pur_type 中的最后一条记录指定用户 - 请参阅上一条评论中链接的 sqlfiddle。
    最近更新 更多