1
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 | pm ,这不是我做的,但不幸的是,我无法改变它。

4

3 回答 3

0

我认为 group 将在通过 ticketID 减少它们时获取第一条记录(正如您所发现的那样)尝试通过 ticketID DESC 对它们进行排序

于 2012-07-09T09:39:39.827 回答
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类型而不是一个字符串。这样,您可以对其进行各种日期/时间计算。

于 2012-07-09T09:39:53.780 回答
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
       );
于 2012-07-09T09:55:37.747 回答