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

oyjwcjzk  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(404)

我在java中得到了一个这样的哈希图

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

Map的长度可能高达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
.......

Map中的键是表中的id字段,值是更新的时间戳字段。
我想得到表中时间戳大于Map值的所有产品。
就像

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

但Map上可能有多达3000个条目。
我正在考虑将map值传递给mysql存储过程。在这个过程中,while循环将为结果集中的每个map条目执行select语句,最后将结果集返回给java程序。
想知道这是否可能,我觉得有一个更好的解决办法,但无法找出。

wa7juj8i

wa7juj8i1#

我会用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都可以有效地利用该索引。但是使用这种方法,我们可能会在单个查询中达到表引用数的上限。因此,这种方法可能需要分解成块。
就我个人而言,我不会隐藏数据库过程的复杂性。
现在还不清楚实现一个数据库过程会给我们带来什么好处。

相关问题