我想我不明白如何解析MariaDB(/ mySQL)中的嵌套查询。 此查询在MSSql中按预期工作,但在MariaDB中不起作用:
SELECT
V.mac,
V.time_grouped,
MIN(V.distance) AS mdist
FROM (
SELECT
mac,
distance,
rectime,
TO_SECONDS(rectime) - MOD(TO_SECONDS(rectime),5) AS time_grouped
FROM myData
) V
GROUP BY V.mac,
V.time_grouped;
我想将定时事件分组到' slot' 5秒我计算了一个字段“time_grouped”'提供这样的插槽。字段' time_grouped'仅保持值为5的倍数,即以0或5结尾。=>工作正常。
现在我想用这个值对结果数据进行分组,即我想在5秒的时隙中找到mac的最小距离。显然,V.time_grouped的所有值都应该是5的倍数。=>他们不是。
所以我认为查询优化器不会以预期的方式处理我的查询。 (我经常(并成功地)在MSSql中使用那些类型的查询)
问:我如何提供所需的结果? 重定向到合适的文档(目前我发现只有嵌套的其他方面的文档,这似乎与我的问题有关)。[编辑] 附上看内部选择的样本数据。 time_grouped中的标记值应该被分组,min(距离)保持为值。 (当然,未标记的行也将保留。) 因此,结果集应该包含15行,而不是26行。
答案 0 :(得分:0)
数据类型问题。
rectime
的数据类型是什么?
请注意,2147483647
是2 ^ 31-1,好像某个地方的大数字被截断为有符号的32位INT
。
在算术中使用DATETIME
时,会将其转换为。比方说,20170112151722:
mysql> SELECT NOW(), 0+NOW(), TO_SECONDS(NOW());
+---------------------+----------------+-------------------+
| NOW() | 0+NOW() | TO_SECONDS(NOW()) |
+---------------------+----------------+-------------------+
| 2017-01-12 15:17:22 | 20170112151722 | 63651453442 |
+---------------------+----------------+-------------------+
您应该将时间转换为" unix时间戳"为了从一些起点(1970年,在MySQL的情况下)将其视为几秒钟:
mysql> SELECT NOW(), UNIX_TIMESTAMP(NOW()), UNIX_TIMESTAMP();
+---------------------+-----------------------+------------------+
| NOW() | UNIX_TIMESTAMP(NOW()) | UNIX_TIMESTAMP() |
+---------------------+-----------------------+------------------+
| 2017-01-12 15:19:34 | 1484263174 | 1484263174 |
+---------------------+-----------------------+------------------+
此仍无法解释此问题。请提供SHOW VARIABLES LIKE 'ver%';
的输出。我希望看到确切的版本和是否是32位版本。当你在场时,请提供SHOW CREATE TABLE MyData;
。