我今天遇到了一个有趣的问题:
让我们假设以下条件
<强>1。有n个用户
<强>2。系统会收集每个司机移动时的 GPS 坐标
<强>3。我们必须查询每个用户的最后 10 条 GPS 坐标记录,按 LAST_UPDATE_DATE 降序排列
<强>4。表中有超过1982008条记录
我通过查询最后的 {(10 + [threshold value]) * n} 记录解决了这个问题,并使用 HashMap 在 java 中排列它们,其中用户是 Key,各个坐标的列表是值(value)观
这似乎不是最佳解决方案,因为它可能会选择随机记录并且可能不会覆盖每个用户的 10 条记录,
在 for 循环中按用户查询也不是最佳解决方案,因为它需要多次数据库调用
任何人都可以建议使用 Spring 数据 JPA 的最佳解决方案是什么,如果 Spring 数据 JPA 无法解决这个问题,我也愿意使用普通 JDBC
我为此使用 Spring 数据 JPA、Mysql、Java 8
这是创建表的命令
@RaymondNijland 好的,这是创建表的命令
CREATE TABLE `gps_coordinate` (
`ID` BIGINT(50) NOT NULL AUTO_INCREMENT,
`user_id` VARCHAR(255) NULL DEFAULT '0',
`driver_id` INT(20) NULL DEFAULT '0',
`latitude` VARCHAR(50) NULL DEFAULT '0.00000000',
`longitude` VARCHAR(50) NULL DEFAULT '0.00000000',
`distance_in_miles` VARCHAR(50) NULL DEFAULT '0.00',
`distance_in_kms` VARCHAR(50) NULL DEFAULT '0.00',
`device_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`created_by` VARCHAR(50) NULL DEFAULT 'Anonymous',
`created_date` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
`updated_by` VARCHAR(50) NULL DEFAULT 'Anonymous',
`updated_date` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`ID_HUB`),
INDEX `user_fk` (`user_id`),
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=208445
;
最佳答案
最好的解决方案通常是将排序和提取留给数据库。 如果您需要在 java 中本地排序和提取数据,您需要将所有数据从数据库提取到您的 java 服务器。这会产生巨大的网络流量开销,导致性能不佳。
有许多数据库可以很好地处理地理空间数据,并且可以查询提供按距离或类似排序的表格。如果您只需要获取每个用户的最后 10 个位置,则不需要地理空间特征,任何数据库都可以正常工作。
有关 MySql 中的解决方案,请阅读 this article .
对于地理数据库,您也可以使用 MySql。这里有一个链接到 spatial data types由 MySql 支持。
关于java - TOP [N] 记录 Group By per user query in the best possible way,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51027253/