我遇到了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运行的。
答案 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
子句在 WHERE
和GROUP BY
之后评估。此时,使用timestamp
列的各个行值并没有任何意义。像往常一样MySQL allows that,但你必须考虑到:
在标准SQL中,包含GROUP BY子句的查询无法引用 HAVING子句中未分配的非聚合列 GROUP BY子句。 MySQL扩展允许引用此类扩展 用于简化计算的列。这个扩展假定了 非组合列将具有相同的分组值。除此以外, 结果是不确定的。
换句话说,您的结果是任意的(甚至不是随机的)。