使用组检索最新记录

时间:2012-07-09 09:36:08

标签: php mysql group-by

table(ms_replies)  
|------------------------------------------|
| id | ticketID |  replyStamp              |
|------------------------------------------|
| 1  |  7       | Tue 11 Oct 2011, 8:56am  |
| 2  |  7       | Wed 12 Oct 2011, 9:20am  |
| 3  |  8       | Wed 12 Oct 2011, 16:24pm |
| 4  |  7       | Thu 27 Oct 2011, 20:28pm |
| 5  |  8       | Tue 18 Oct 2011, 9:54am  |
|------------------------------------------|

我到目前为止的代码是:

SELECT 
    ticketID,
    MAX(replace(replace(replyStamp, 'pm',''), 'am','')) AS time
FROM 
    ms_replies 
WHERE 
    `ticketID` IN ($IDs)
GROUP BY 
    ticketID

但这不会返回最近的条目。

请注意,查询中的replace必须删除am |下午,这不是我的行为,但不幸的是,我无法闯入它。

3 个答案:

答案 0 :(得分:0)

我认为group会在第一条记录中删除它们,因为它已经被ticketID(你发现了)尝试通过ticketID DESC命令它们

答案 1 :(得分:0)

使用此解决方案:

SELECT a.ticketID, a.replyStamp
FROM ms_replies a
INNER JOIN 
(
    SELECT MAX(id) AS maxid
    FROM ms_replies
    WHERE ticketID IN ($IDs)
    GROUP BY ticketID
) b ON a.ticketID = b.maxid

顺便说一句,您应该将replyStamp列设为TIMESTAMPDATETIME类型而不是字符串。这样,您就可以对其进行各种日期/时间计算。

答案 2 :(得分:0)

如果要将字符串作为日期进行比较,则必须将字符串转换为日期:

SELECT ticketID,
         MAX(STR_TO_DATE(
           REPLACE(REPLACE(replyStamp, 'am', ''), 'pm', ''), 
           '%a %d %b %Y, %T')) AS max_time
    FROM ms_replies 
   WHERE ticketID IN (7, 8)
GROUP BY ticketID;

但实际上并不要求最新的条目总是有最大ID(如你的样本);然后你可以改为检查MAX(id),就像在@ZaneBien回答中一样 - 或者在这里:

SELECT m.ticketID, m.replyStamp
  FROM ms_replies AS m
 WHERE m.id = (
         SELECT MAX(id) FROM ms_replies 
         WHERE ticketID = m.ticketID
       );