需要MySQL的帮助

时间:2010-09-14 22:38:12

标签: mysql greatest-n-per-group sql

我在使用SQL查询时遇到了一些麻烦。这就是为什么我希望你们中的一些人能够帮助我。

我有一个查询,从每个关系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,我希望看到status =“Kommet”的最新条目....

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

事先感谢你的帮助......非常感谢:)

1 个答案:

答案 0 :(得分:1)

如果您不想为获取ID而烦恼,那么您可以执行以下操作:

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

如果你需要id,那么tou不能只添加到SELECT列表中,因为GROUP BY将拉出其中一个匹配的ID以显示在这里,而不是必须一个与MAX(timestamp)匹配的。