mysql查询用于在存储过程中执行的长查询

时间:2018-08-21 15:29:39

标签: mysql java-stored-procedures

我在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程序。

想知道这是否可行,我觉得有更好的解决方案,但无法解决。

1 个答案:

答案 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都可以有效地使用它。但是使用这种方法,我们可能会在单个查询中达到表引用数量的上限。因此,可能需要将这种方法分解为大块。


我个人不会隐藏数据库过程中的复杂性。

目前尚不清楚通过实施数据库过程将获得什么好处。