首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql:按用户和案例编号选择最新条目

Mysql:按用户和案例编号选择最新条目
EN

Stack Overflow用户
提问于 2011-11-28 21:40:04
回答 3查看 1.1K关注 0票数 3

我有一个表,它的数据如下所示:

代码语言:javascript
复制
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');

我正在尝试选择每个用户在每个案例上的最新案例笔记(按date)。我想出的最好的结果是:

代码语言:javascript
复制
SELECT * , MAX(  `date` ) FROM cm_case_notes WHERE case_id =  '1175' GROUP BY username

但是,这不会给出最新的条目,而是每个用户的第一个条目。我在这里看到了几个类似的帖子,但我似乎就是无法理解它们。有没有人会同情sql缺陷并提供帮助呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-28 23:15:49

如果您只需要每个用户和每个案例的最新案例说明的日期,则可以使用以下命令:

代码语言:javascript
复制
--- Q ---
SELECT case_id
     , username 
     , MAX(  `date` ) AS recent_date 
FROM cm_case_notes 
GROUP BY case_id
       , username 

如果您想要这些行中的所有列(具有最新日期),请访问Quassnoi链接以获得各种解决方案(或其他提供的链接)。最容易编写的方法是将上述查询转换为一个子查询,并将其连接到cm_case_notes

代码语言:javascript
复制
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` )

如果您只想要lastet case注释,但仅针对特定的case_id,那么您可以在cnQ中添加where条件(Q稍作修改):

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2011-11-28 22:22:10

您没有得到想要从数据库中获取的内容的原因是将SELECT *GROUP一起使用。

事实上,只有聚合函数和/或组字段本身的结果才能安全地为SELECTed。选择任何其他选项都会导致意外的结果。(确切的结果取决于顺序、查询优化等)。

您试图实现的目标称为获取"groupwise最大值“。这是SQL中的一个常见问题/常见任务,您可以在此处阅读一篇很好的文章:http://jan.kneschke.de/projects/mysql/groupwise-max/

或者在这里的MySQL手册中:http://dev.mysql.com/doc/refman/5.1/en/example-maximum-column-group-row.html

或者stackoverflow用户Quassnoi在这里详细的详细解释:http://explainextended.com/2009/11/24/mysql-selecting-records-holding-group-wise-maximum-on-a-unique-column/

票数 2
EN

Stack Overflow用户

发布于 2011-11-28 21:42:29

你有没有考虑过DESC排序和简单的限制1?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8296629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档