我在Java中有这样的哈希映射
{(1,'2018-06-29 10:19:33'),(4,'2018-06-29 10:19:34'),(10,'2018-06-29 10:19:38'),....}
地图的长度可能高达3000
和一个mysql表
id name updated
1, firstProduct, 2018-06-29 09:19:33
2, secondproduct, 2014-06-29 10:19:33
4, fourthproduct, 2016-06-29 09:19:33
10, tenthproduct, 2018-06-29 06:13:32
.......
地图中的键是表中的id字段,值是更新的时间戳记字段。
我想获得表中所有时间戳大于地图中值的产品。
喜欢
select * from products where id = 1 and updated > '2018-06-29 10:19:33'
select * from products where id = 4 and updated > '2018-06-29 10:19:34'
...
但是地图中可能有多达3000个条目。
我正在考虑将映射值传递给mysql存储过程。在该过程中,while循环将对进入结果集的每个映射条目执行select语句,最后将结果集返回给Java程序。
想知道这是否可行,我觉得有更好的解决方案,但无法解决。
答案 0 :(得分:0)
我会用Java动态生成一条语句。
要么:
SELECT p.id, p.name, p.update FROM products p WHERE p.id = ? AND updated > ?
UNION ALL
SELECT p.id, p.name, p.update FROM products p WHERE p.id = ? AND updated > ?
UNION ALL
SELECT p.id, p.name, p.update FROM products p WHERE p.id = ? AND updated > ?
(MySQL可能不会有效地使用该查询的索引。)
或者,我们可以做:
navigator.geolocation.getCurrentPosition((position) => {
api += `lat=${position.coords.latitude}&lon=${position.coords.longitude}`;
this.fetchWeather(api);
});
定义了适当的索引后,每个SELECT都可以有效地使用它。但是使用这种方法,我们可能会在单个查询中达到表引用数量的上限。因此,可能需要将这种方法分解为大块。
我个人不会隐藏数据库过程中的复杂性。
目前尚不清楚通过实施数据库过程将获得什么好处。