2010-09-14 285 views
2

我遇到了一个SQL查询有点麻烦。这就是为什么我希望你们中的一些人能够帮助我。需要MySQL帮助

我有一个查询,从每个关系ID中选择最新的条目,但我想选择状态不同的最新条目。桌子看起来像这样。

+-----------+-------------+------+-----+-------------------+----------------+ 
| Field  | Type  | Null | Key | Default   | Extra   | 
+-----------+-------------+------+-----+-------------------+----------------+ 
| id  | int(11)  | NO | PRI | NULL    | auto_increment | 
| kid_id | int(11)  | NO |  | NULL    |    | 
| status | varchar(50) | NO |  | NULL    |    | 
| timestamp | timestamp | NO |  | CURRENT_TIMESTAMP |    | 
+-----------+-------------+------+-----+-------------------+----------------+ 

而我目前的查询看起来像这样。

SELECT * 
      FROM (
       SELECT * 
       FROM actions 
       AS a 
       WHERE date(timestamp) = curdate() 
       AND timestamp = (
        SELECT max(timestamp) 
        FROM actions 
        AS b 
        WHERE a.kid_id = b.kid_id 
        ) 
       ) 
      AS c 
      ORDER BY kid_id 

而结果是这样的:

id kid_id status timestamp 
54 1 Kommet 2010-09-15 00:14:51 
57 2 Gået 2010-09-15 00:17:58 
56 3 Kommet 2010-09-15 00:15:00 

的问题是,在那里kid_id等于2,我想看到最新的条目,其中状态=“Kommet” ......

我想要每个孩子的2条最新记录。第一条记录,其中状态=“Kommet”,第二个,其中状态=“Gået”

在事先非常感谢你的帮助......这真是感激:)

+1

我已经添加了“每个组最大的标签”。这种类型的查询在Stack Overflow上已经被回答了几十次。阅读一些解决方案。 – 2010-09-14 23:03:48

回答

1

如果你不打扰有关获取的ID,那么你可以运行以下命令:

SELECT kid_id, status, MAX(`timestamp`) as `timestamp` 
FROM actions 
WHERE DATE(`timestamp`) = CURDATE() 
GROUP BY kid_id, status 

如果您需要id,土特产品不能只是添加到列表SELECT不过,作为GROUP BY将拉动匹配ID在这里显示的一个,不一定是匹配MAX(timestamp)的那个。

+0

非常感谢你的帮助。我做了一些小的修改,但基本上这解决了我的问题:) – nickifrandsen 2010-09-15 14:23:22