MariaDB/ mySQL 分组嵌套 SQL 结果不像在 MSSQL 中那样工作?
MariaDB/ mySQL grouping nested SQL results doesn't work as in MSSQL?
我想我不明白 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;
我想将定时事件分组为 'slots' 5 秒。我计算了一个字段'time_grouped'来提供这样的插槽。字段 'time_grouped' 仅包含 5 的倍数的值,即以 0 或 5 结尾。=> 工作正常。
现在我想根据这个值对结果数据进行分组,即我想在 5 秒时隙中找到 mac 的最小距离。显然,V.time_grouped 的所有值都应该是 5 的倍数。=> 它们不是。
所以我认为查询优化器没有以预期的方式处理我的查询。
(我在 MSSql 中经常(并且成功地)使用了这类查询)
问:如何提供想要的结果?
感谢重定向到合适的文档(到目前为止,我只找到了关于嵌套其他方面的文档,这似乎与我的问题有关)。
[编辑]
附见内部示例数据select。 time_grouped 中的标记值应该分组,最小(距离)保留为值。
(当然,未标记的行也会保留。)
因此结果集应该包含 15 行而不是 26 行。
数据输入问题。
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 timestamp",以便将其视为从某个起点开始的秒数(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;
.
我想我不明白 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;
我想将定时事件分组为 'slots' 5 秒。我计算了一个字段'time_grouped'来提供这样的插槽。字段 'time_grouped' 仅包含 5 的倍数的值,即以 0 或 5 结尾。=> 工作正常。
现在我想根据这个值对结果数据进行分组,即我想在 5 秒时隙中找到 mac 的最小距离。显然,V.time_grouped 的所有值都应该是 5 的倍数。=> 它们不是。
所以我认为查询优化器没有以预期的方式处理我的查询。 (我在 MSSql 中经常(并且成功地)使用了这类查询)
问:如何提供想要的结果? 感谢重定向到合适的文档(到目前为止,我只找到了关于嵌套其他方面的文档,这似乎与我的问题有关)。
[编辑] 附见内部示例数据select。 time_grouped 中的标记值应该分组,最小(距离)保留为值。 (当然,未标记的行也会保留。) 因此结果集应该包含 15 行而不是 26 行。
数据输入问题。
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 timestamp",以便将其视为从某个起点开始的秒数(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;
.