Jud*_*son 3 mysql greatest-n-per-group
我有一个表,其数据如下所示:
INSERT INTO `cm_case_notes` (`id`, `case_id`, `date`, `time`, `description`, `username`, `supervisor`, `datestamp`) VALUES
(45977, '1175', '2010-11-19 16:27:15', 600, 'Motion hearing...Denied.', 'bjones', 'jharvey,', '2010-11-19 21:27:15'),
(46860, '1175', '2010-12-11 16:11:19', 300, 'Semester Break Report', 'bjones', 'jharvey,', '2010-12-11 21:11:19'),
(48034, '1175', '2011-05-04 17:30:03', 300, 'test', 'bjones', 'jharvey,', '2011-05-04 22:30:03'),
(14201, '1175', '2009-02-06 00:00:00', 3600, 'In court to talk to prosecutor, re: the file', 'csmith', 'sandrews', '2009-02-07 14:33:34'),
(14484, '1175', '2009-02-13 00:00:00', 6300, 'Read transcript, note taking', 'csmith', 'sandrews', '2009-02-16 17:22:36');
Run Code Online (Sandbox Code Playgroud)
我正在尝试为date每个用户选择每个案例的最新案例说明(by ).我提出的最好的是:
SELECT * , MAX( `date` ) FROM cm_case_notes WHERE case_id = '1175' GROUP BY username
Run Code Online (Sandbox Code Playgroud)
但是,这并不是最近的条目,而是每个用户的第一个条目.我在这里看过几个类似的帖子,但我似乎无法让我的大脑围绕着他们.有人会对sql缺陷和帮助表示同情吗?
如果您只希望每个用户和每个案例的最新案例说明的日期,您可以使用:
--- Q ---
SELECT case_id
, username
, MAX( `date` ) AS recent_date
FROM cm_case_notes
GROUP BY case_id
, username
Run Code Online (Sandbox Code Playgroud)
如果您想要这些行中的所有列(具有最近的日期),请遵循各种解决方案(或其他提供的链接)的Quassnoi链接.最容易编写的是将上述查询转换为子查询并将其连接到cm_case_notes:
SELECT cn.*
FROM
cm_case_notes AS cn
JOIN
( Q ) AS q
ON ( q.case_id, q.username, q.recent_date )
= ( cn.case_id, cn.username, cn.`date` )
Run Code Online (Sandbox Code Playgroud)
如果你只是想在lastet情况下笔记,但只针对特定的case_id,那么你可以在这两个加where条件cn和Q(Q略有修改):
SELECT cn.*
FROM
cm_case_notes AS cn
JOIN
( SELECT username
, MAX( `date` ) AS recent_date
FROM cm_case_notes
WHERE case_id = @particular_case_id
GROUP BY username
) AS q
ON ( q.username, q.recent_date )
= ( cn.username, cn.`date` )
WHERE cn.case_id = @particular_case_id
Run Code Online (Sandbox Code Playgroud)