mysql获取最近一行最常见的列值

时间:2017-05-15 13:59:37

标签: mysql

首先,我需要获取10个最常见的列值,然后从它们的值中我需要最新的行。

我可以很容易地获得10个最新的列值:

SELECT animal, count(*) FROM mammals GROUP BY animal ORDER BY count(*) DESC LIMIT 10;

我还可以获得这样一个值的最新行:

SELECT * FROM mammals where animal = 'monkey' ORDER BY check_date DESC LIMIT 1;

如果可能,我需要在一个查询中执行这两个操作。 最接近的我得到了我需要的一切,除了它没有得到最近一行的值,它得到第一行。

SELECT animal, check_date, count(*) FROM mammals GROUP BY animal ORDER BY count(*) DESC LIMIT 10;

编辑:

我想添加更多信息,因为我不确定它是否足够清晰。

如果我有这样的表:

+------------------------+---------------------+
| Monkey                 | 2017-05-08 19:35:30 |
| Monkey                 | 2017-05-09 08:33:16 |
| Giraffe                | 2017-05-09 08:35:24 |
| Giraffe                | 2017-05-09 09:09:25 |
| Monkey                 | 2017-05-09 09:22:43 |
| Giraffe                | 2017-05-09 09:24:23 |
| Giraffe                | 2017-05-09 09:25:07 |
| Monkey                 | 2017-05-09 09:26:00 |
| Lion                   | 2017-05-09 09:26:17 |
| Lion                   | 2017-05-09 09:28:35 |
| Gazelle                | 2017-05-09 09:29:34 |
| Monkey                 | 2017-05-09 13:29:39 |
| Gazelle                | 2017-05-09 13:35:01 |
| Gazelle                | 2017-05-09 14:52:57 |
+------------------------+---------------------+

我运行上面的第三个查询我最终得到了这个:

+------------------+---------------+----------------+
| Animal           | check_date          | count(*) |
+------------------+---------------+----------------+
| Monkey           | 2017-05-08 19:35:30 |        5 |
| Giraffe          | 2017-05-09 08:35:24 |        4 |
| Gazzelle         | 2017-05-09 09:29:34 |        3 |
| Lion             | 2017-05-09 09:26:17 |        2 |
+------------------+---------------+----------------+

表格显然比这大得多,但想象一下这些是最常见的价值观。正如您所看到的,第3个查询返回的行是最旧的行,但我需要最新的行。所以对于Monkey来说,这将是' 2017-05-09 13:29:39'。

我需要表格如下:

+------------------+---------------+----------------+
| Animal           | check_date          | count(*) |
+------------------+---------------+----------------+
| Monkey           | 2017-05-09 13:29:39 |        5 |
| Giraffe          | 2017-05-09 09:25:07 |        4 |
| Gazzelle         | 2017-05-09 14:52:57 |        3 |
| Lion             | 2017-05-09 09:28:35 |        2 |
+------------------+---------------+----------------+

谢谢:)

1 个答案:

答案 0 :(得分:1)

这应该做你想要的。

select animal, max(check_date) as max_date, count(*) as count
  from mammals
  group by animal
  order by count(*) desc
  LIMIT 10;

这是我根据您的示例数据从上述查询输出的。

Monkey  | 2017-05-09 13:29:39.000 | 5 
Giraffe | 2017-05-09 09:25:07.000 | 4
Gazelle | 2017-05-09 14:52:57.000 | 3
Lion    | 2017-05-09 09:28:35.000 | 2