mysql与max()和min()之间的区别?

时间:2014-05-14 07:17:49

标签: mysql function max

我遇到了mySql查询和max()函数的问题。 如果我这样做:

Select * from Data group by experiment having min(timestamp)

此查询返回我想要的内容,并更正值。 我明白了:

+----------+---------+----------+---------------------+----------------+------------+
| id       | mote_id | label_id | timestamp           | value          | experiment |
+----------+---------+----------+---------------------+----------------+------------+
|  3768806 |      10 |       30 | 2014-04-22 14:37:07 |              0 |         13 |
| 10989209 |      12 |       22 | 2014-04-25 10:44:03 | 2.532958984375 |         15 |
| 11943537 |       6 |       19 | 2014-05-05 17:20:15 |           1228 |         16 |
| 12042549 |      16 |       26 | 2014-05-06 10:48:59 |          22.86 |         17 |
| 12176642 |      15 |       23 | 2014-05-07 15:19:35 |              0 |         18 |
| 12195344 |      10 |        6 | 2014-05-07 15:27:23 |           3460 |         19 |
| 12222470 |      15 |        8 | 2014-05-07 15:38:38 |              1 |         21 |
| 12343934 |      10 |       19 | 2014-05-12 10:35:42 |            742 |         23 |
+----------+---------+----------+---------------------+----------------+------------+

但是,如果我这样做:

Select * from Data group by experiment having max(timestamp)

此查询返回错误的值...像这样:

+----------+---------+----------+---------------------+----------------+------------+
| id       | mote_id | label_id | timestamp           | value          | experiment |
+----------+---------+----------+---------------------+----------------+------------+
|  3768806 |      10 |       30 | 2014-04-22 14:37:07 |              0 |         13 |
| 10989209 |      12 |       22 | 2014-04-25 10:44:03 | 2.532958984375 |         15 |
| 11943537 |       6 |       19 | 2014-05-05 17:20:15 |           1228 |         16 |
| 12042549 |      16 |       26 | 2014-05-06 10:48:59 |          22.86 |         17 |
| 12176642 |      15 |       23 | 2014-05-07 15:19:35 |              0 |         18 |
| 12195344 |      10 |        6 | 2014-05-07 15:27:23 |           3460 |         19 |
| 12222470 |      15 |        8 | 2014-05-07 15:38:38 |              1 |         21 |
| 12343934 |      10 |       19 | 2014-05-12 10:35:42 |            742 |         23 |
+----------+---------+----------+---------------------+----------------+------------+

在第一个查询中,如果我将min(timestamp)替换为timestamp=min(timestamp),则可行,但在第二个查询中,"timestamp=max(timestamp)"返回

最后,Select experiment,max(timestamp)会返回正确的值。

的MySQL>通过实验从数据组中选择*,max(时间戳);

+----------+---------+----------+---------------------+----------------+------------+---------------------+
| id       | mote_id | label_id | timestamp           | value          | experiment | max(timestamp)      |
+----------+---------+----------+---------------------+----------------+------------+---------------------+
|  3768806 |      10 |       30 | 2014-04-22 14:37:07 |              0 |         13 | 2014-04-24 16:03:29 |
| 10989209 |      12 |       22 | 2014-04-25 10:44:03 | 2.532958984375 |         15 | 2014-05-05 10:34:35 |
| 11943537 |       6 |       19 | 2014-05-05 17:20:15 |           1228 |         16 | 2014-05-06 10:35:15 |
| 12042549 |      16 |       26 | 2014-05-06 10:48:59 |          22.86 |         17 | 2014-05-07 15:19:33 |
| 12176642 |      15 |       23 | 2014-05-07 15:19:35 |              0 |         18 | 2014-05-07 15:27:23 |
| 12195344 |      10 |        6 | 2014-05-07 15:27:23 |           3460 |         19 | 2014-05-07 15:38:01 |
| 12222470 |      15 |        8 | 2014-05-07 15:38:38 |              1 |         21 | 2014-05-07 16:30:38 |
| 12343934 |      10 |       19 | 2014-05-12 10:35:42 |            742 |         23 | 2014-05-14 09:25:44 |
+----------+---------+----------+---------------------+----------------+------------+---------------------+

我知道我可以创建一个子查询来解决我的问题,但这些表包含数千行,这个解决方案太长了......

Ps:我不能使用Select*, max(timestamp),即使它有效,因为查询是由JEE中的EJB运行的。

2 个答案:

答案 0 :(得分:1)

您选择未按字段experiment分组的确定值。没有人可以保证非聚集字段对应于某些聚合字段的MIN或MAX值。

您必须使用子查询或自联接才能获得正确的记录。

在此处查看更多内容:http://dev.mysql.com/doc/refman/5.6/en/example-maximum-column-group-row.html

答案 1 :(得分:0)

HAVING子句需要一个布尔表达式。在其他DBMS中,您的代码示例将触发错误。在MySQL中,您将获得表达式强制转换为boolean:

  • 零→假
  • 非零→真实

由于你的表达式对整个集合来说是不变的,所以它不会过滤掉部分行。

关于这一点:

HAVING timestamp = max(timestamp)

HAVING子句在 WHEREGROUP BY之后评估。此时,使用timestamp列的各个行值并没有任何意义。像往常一样MySQL allows that,但你必须考虑到:

  

在标准SQL中,包含GROUP BY子句的查询无法引用   HAVING子句中未分配的非聚合列   GROUP BY子句。 MySQL扩展允许引用此类扩展   用于简化计算的列。这个扩展假定了   非组合列将具有相同的分组值。除此以外,   结果是不确定的。

换句话说,您的结果是任意的(甚至不是随机的)。