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

mysql query for long query to execute in stored procedure

我在 java 中得到了一个像这样的哈希映射

{(1,'2018-06-29 10:19:33'),(4,'2018-06-29 10:19:34'),(10,'2018-06-29 10:19:38'),....}

地图长度可达3000

和一个mysqltable

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
.......

映射中的键是 table 中的一个 id 字段,值是更新的时间戳字段。

我想获取 table 中时间戳大于地图中值的所有产品。

喜欢

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 语句,最后 return 结果集返回 java 程序。

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

我会在 Java 中动态生成一个语句。

或者:

 SELECT p.id, p.name, p.update 
   FROM products p
  WHERE 1=0 
     OR ( p.id = ? AND updated > ? )
     OR ( p.id = ? AND updated > ? )
     OR ( p.id = ? AND updated > ? )

(MySQL 可能不会为该查询有效使用索引。)

或者,我们可以这样做:

 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 > ?

定义了适当的索引后,每个 SELECT 都可以有效地利用它。但是使用这种方法,我们可能会在单个查询中达到 table 引用数量的上限。所以这种方法可能需要分解成块。


就个人而言,我不会隐藏数据库过程的复杂性。

不清楚我们通过实施数据库过程可以获得什么好处。